已知某结构体变量中某一元素的地址求结构体变量的地址。

 

 

 地址、指针,无类型无符号,可以转化为指向任何类型。这种转化不会进行实际的读写,只是逻辑的计算,所以不会产生非法操作。例如本例中对NULL的转换,(abc*)0 将0地址强制转换为指向abc的指针。需要注意的一点是,虽然类型转换不会产生问题,但在对这些地址进行加减计算时却容易混淆。这是本例的重点。

例如:对一个指向int型的指针进行加1或减1的操作,实际是加4或减4,4来自于sizeof(int)。对一个指向char型的指针进行加1或减压1的操作,是进行一个加sizeof(char)或减sizeof(char)的操作。char在一般的系统上占一个字节。

对地址的加减是要乘以位于该地址的变量的sizeof()的,这就是我们计算l时,选择将(t1.next)地址类型强制转换成char *型的原因。此外,地址加减的对象应该是一个整数,这样"整数Xsizeof(类型)"才有意义。虽然上例中,我们将&(((abc*)0)->next)强制转换成char *型结果也正确,但那是巧合,实际无意义。

此外,如下定义也有意义:

unsinged long l;
l = ((unsigned long)(&(t1.next)) - (unsigned long)(&(((abc *)0)->next)));

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值