您的位置:首页 > 编程语言 > C语言/C++

陈正冲--C语言深度剖析 p89详解

2016-10-13 18:35 274 查看
int *p = (int *)0x12ff 7c;(我的编译器分配的内存地址)

*p = NULL;

在执行完第二条代码之后,发现p的值变为0x00000000了。我们都知道给指针指向的空间赋值,不会改变指针的值。难道这个结论有错,我继续试了下。

int i = 10;

int *p = (int *)0x12ff7c;

*p = NULL;

此时指针p的值并未改变,此时结果正确,我又测试了,

char ch = 10;

char *p = (char *)0x12ff7c;

*p = NULL;

此时指针p的值没变,可当我删除第一行的时候,指针的值又变了,这里的p 的值并未变成0x00000000,而是变成了0x0012ff00。说到这里,是不是编译器的一个bug?作者认为这是编译器的bug。然而我重新调试了一下,发现了问题。

这并不是编译器的bug,而是结果却是如此。且听我慢慢分析。

对于第一个例子,&p = 0x0012ff7c, p = 0x0012ff7c,也就是说指针p指向的是它本身。

       p 首地址是0012ff7c           
高地址    00          

12             

   FF               

低地址 7C

 

由于p指向的是本身,也就是说改变指针p指向的空间的值,就等价于改变p的值,此时p变为0x00000000。照这样说,第三个例子应该也为0x00000000,为什么是0x12ff00。同志别急吗。此时p也指向本身,但p指向的数据类型是char型,而p占4 bytes,此时 *p = NULL语句只能改变p的低地址的值,即7c变为00,答案就是0012ff00。

 

结论: 从这个问题可以知道,在一般情况下,改变指针指向的空间的值,是不会改变指针的值,除非指针指向的是它本身。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: