68 指针的减法操作
前言
这是一个 老生常谈的问题
就是 两个结构体Person指针, p1, p2, 指向的是 虚拟内存中相邻的两个结构体对象
然后 p2 – p1 的值得到的是 1, 而不是 sizeof(struct Person)
然后 我们来看一下 这里的编译之后的是一个实现
测试用例
这里 我们通过调节 field03 来调整 Person 结构体的占用空间
并参照 两份编译之后的 结果
#include<stdio.h>typedef struct Person {int age;int height;
// int field03;
} Person;int main(int argc, char **argv) {struct Person list[10], *p1, *p2;list[0].age = 12;list[2].age = 22;p1 = &list[0];p2 = &list[2];int delta = (int) (p2 - p1);printf(" the delta : %d \n", delta);return 0;}
sizeof(Person) 为 8
我们来看一下 0x00000000004005DF 的位置的相关系列代码
对应于业务代码中的 “int delta = (int) (p2 - p1);”
获取了 p2指针 和 p1指针, 然后做减法, 然后右移了3位, 等价于 /8, 然后将结果为 delta
看一下 运行时的状态
sizeof(Person) 为 12
我们来看一下 0x00000000004005E5 的位置的相关系列代码
对应于业务代码中的 “int delta = (int) (p2 - p1);”
获取了 p2指针 和 p1指针, 然后做减法, 然后右移了2位, 等价于 /4
然后又乘以了一个 0xaaaaaaaaaaaaaaab, 等价于 / 3
因此最终是将 p2指针 和 p1指针 的地址之差 除以了 12
可以大致得出的规律 是结构体指针的减法是 两者地址只差, 还要除以 sizeof(struct Type)
看一下 运行时的状态
关于 /3 的实现的一个测试用例
关于规范
这个在 c/c++ 相关规范中能够找到具体的说明
Arithmetic operators - cppreference.com
完