一道指针相关题目的跟踪

测试1
int *p=(int *)0x12ff7c;
*p=NULL;
p=NULL;

为什么在执行完第2条代码之后,发现p的值变为0x00000000(这有点匪夷所思吧?)
int i=10;
int *p=(int *)0x12ff7c;
*p=NULL;
p=NULL;
这样子的话,p的值就没有变,p所指向的内存的值成了0(这样P的值就不变了?)

测试2
//char ch=10;
char *p=(char *)0x12ff7c;
*p=NULL;
//p=NULL;

如果char ch=10;不去掉,则结果正确,跟我们所想的是一样的结果
如果去掉,则p的值也不是0x00000000,而是变成了0x0012ff00,*p变成了0(这里也有点奇妙的)

大哥,我斗胆说一句你真是白学汇编了。
0x12ff7c 是VC默认第一个变量的地址, 也就是 p ,p就是放在 0x12ff7c中int *p=(int *)0x12ff7c; 执行这句之后, *p=0x12ff7c 也就是,地址0x12ff7c中放了一个常量0x12ff7c,   
之后执行*p=NULL;也就是在取变量P中的常量0x12ff7c作地址, 把地址0x12ff7c中的内容变成0,刚好,
0x12ff7c 就是p的地址!所以把p变成0! 

1.这个主要是栈的问题,一般是不推荐直接采用int *p=(int *)0x12ff7c;形式来直接操作栈上的内容的,你想一下,0x12ff7c这个地址在程序开始时分配给了p,为其保存地址,*p实际上就是0x12ff7c地址上所保存的东西,就是&p与p都是0x12ff7c,所以当*p=NULL时p就为NULL了。
2.之后你加入了int i=10;程序将0x12ff7c地址分配给了i,也就是你运行完程序i就为0了。
3.你如果用char *p=(char *)0x12ff7c;来保存,&p与p为0x12ff7c,*p其实只是后面的7c,将其置0,p就只剩0x12ff00。

你的0x12ff7c应该就是一个堆栈的地址。
如果没有定义别的变量,那么&p = 0x12ff7c
如果是int类型,*p=NULL,那么p也就等于0
如果是char类型,*p=NULL,那么在小端就等于给低位付0,也就是0x12ff00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值