陈正冲--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。
结论: 从这个问题可以知道,在一般情况下,改变指针指向的空间的值,是不会改变指针的值,除非指针指向的是它本身。
*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。
结论: 从这个问题可以知道,在一般情况下,改变指针指向的空间的值,是不会改变指针的值,除非指针指向的是它本身。
相关文章推荐
- C语言深度剖析-----内存管理的艺术
- C语言深度剖析之—指针与内存地址(函数指针,普通指针,指针数组,数组的指针,指针的指针)
- C语言深度剖析--运算符
- C语言深度剖析--读书笔记4_signed/unsigned关键字
- C语言深度剖析学习笔记-符号
- C语言深度剖析之—指针与内存地址(函数指针,普通指针,指针数组,数组的指针,指针的指针)
- 1.读c语言深度剖析 -- 运算符的优先级
- 6.读c语言深度剖析 -- 第一章 关键字(32个)
- C语言深度剖析-----数组参数和指针参数分析
- C语言深度剖析-----函数与指针分析
- 读c语言深度剖析 -- if else
- 读c语言深度剖析 -- 简谈Struct union(大端小端)
- C语言深度剖析学习笔记-预处理
- 20110907C语言深度剖析笔记
- 深度剖析C语言的各种指针
- 2.读c语言深度剖析 -- ++、--操作符
- 7.读c语言深度剖析 -- if else
- C语言深度剖析-----指针数组和数组指针的分析
- C语言深度剖析笔记(六)
- C语言深度剖析-预处理