最近看了面试宝典的一个题,写一个宏函数FIND(struc,a),要算出结构体里的变量相对于结构体的偏移量,如:
1 typedef struct{2 int a;3 char b;4 int ccc;5 }b;6 FIND(b,a)//结果为0
#define FIND(struc,a) { printf("%p\n",(&(struc.a)) - (&struc)); }typedef struct{ int a; char b; int ccc;}b;void main(){ int d; b c; FIND(c,ccc); exit(0);}
后来通过发帖询问,找到了原因。
原来是因为指针直接相减的话,他们有一个单位,那就是这个指针的类型。
例如
1 int a[3];2 printf("%d\n",(&a[2]) - (&a[1]));
显示的结果就是1,因为他们的单位是sizeof(int),是他们的地址只差/sizeof(int),所以如果要求的是地址只差,应该把他们转换成整形再进行数值计算。