c语言 存储管理地址转换,C语言地址的强制转换

地址的强制转换

先看下面这个例子:

struct Test

{

int Num;

char *pcName;

short sDate;

char cha[2];

short sBa[4];

}*p;

假设p 的值为0x100000。 如下表表达式的值分别为多少?

p + 0x1 = 0x___ ?

(unsigned long)p + 0x1 = 0x___?

(unsigned int*)p + 0x1 = 0x___?

我相信会有很多人一开始没看明白这个问题是什么意思。其实我们再仔细看看,这个知识点

似曾相识。一个指针变量与一个整数相加减,到底该怎么解析呢?

还记得前面我们的表达式“a+1 ”与“&a+1”之间的区别吗?其实这里也一样。指针变

量与一个整数相加减并不是用指针变量里的地址直接加减这个整数。这个整数的单位不是

byte 而是元素的个数。所以:

p+0x1的值为0x100000+sizof(Test )*0x1。至于此结构体的大小为 20byte ,前面的章

节已经详细讲解过。所以p+0x1的值为:0x100014。

(unsigned long)p + 0x1 的值呢?这里涉及到强制转换,将指针变量 p 保存的值强制转换

成无符号的长整型数。任何数值一旦被强制转换,其类型就改变了。所以这个表达式其实就

是一个无符号的长整型数加上另一个整数。所以其值为:0x100001。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值