指针相减的单位

本文探讨了在C语言中计算结构体变量相对于结构体偏移量的方法,通过宏函数实例展示了如何准确获取指定成员的内存位置,并解释了指针相减时单位的概念及解决办法。

最近看了面试宝典的一个题,写一个宏函数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);
}


结果打印的结果是2,但是真正的结果应该是8。后来经过我的实验发现吧FIND改成
#define FIND(struc,a) { printf("%p\n",((unsigned int)&(struc.a)) - ((unsigned int)&struc)); }
就能得出正确的结果。

 

后来通过发帖询问,找到了原因。

原来是因为指针直接相减的话,他们有一个单位,那就是这个指针的类型。

例如

1 int a[3];
2 printf("%d\n",(&a[2]) - (&a[1]));

显示的结果就是1,因为他们的单位是sizeof(int),是他们的地址只差/sizeof(int),所以如果要求的是地址只差,应该把他们转换成整形再进行数值计算。

转载于:https://www.cnblogs.com/cxjchen/archive/2012/10/22/2733683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值