陈正冲--C语言深度剖析 p89详解
来源:互联网 发布:vscode for xp 编辑:程序博客网 时间:2024/06/06 03:48
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
由于p指向的是本身,也就是说改变指针p指向的空间的值,就等价于改变p的值,此时p变为0x00000000。照这样说,第三个例子应该也为0x00000000,为什么是0x12ff00。同志别急吗。此时p也指向本身,但p指向的数据类型是char型,而p占4 bytes,此时 *p = NULL语句只能改变p的低地址的值,即7c变为00,答案就是0012ff00。
结论: 从这个问题可以知道,在一般情况下,改变指针指向的空间的值,是不会改变指针的值,除非指针指向的是它本身。
*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。
结论: 从这个问题可以知道,在一般情况下,改变指针指向的空间的值,是不会改变指针的值,除非指针指向的是它本身。
0 0
- 陈正冲--C语言深度剖析 p89详解
- C语言深度剖析
- C语言深度剖析
- 《C语言深度剖析》
- C语言深度剖析
- C语言深度剖析
- C语言深度剖析
- C语言深度剖析
- <<C语言深度剖析>>学习笔记之二:关键字详解
- c语言深度剖析 -- 读书笔记
- 《c语言深度剖析》笔记
- C语言深度剖析--枚举
- C语言深度剖析-预处理
- 《C语言深度剖析》笔记
- C语言深度剖析读书笔记
- C语言深度剖析读书笔记
- 《C语言深度剖析》笔记
- C语言深度剖析-----函数
- 深度学习总结(2016.9--2016.10)
- windows下命令行控制 Tomcat
- ViewPager显示多个item,Touch事件无死角(不用marginLeft,Right等实现)
- 建站这件小事(一)【服务器,域名和域名解析】
- 关于PWM波
- 陈正冲--C语言深度剖析 p89详解
- UITabBar
- mysql,Date类型转换和差值
- The Suspects
- AsyncTask
- Linux云服务器配置(更新中)
- 第二部分 Android中利用Handler实现消息的分发机制
- tesseract 识别图片应用一
- NOIP2014提高组解析