空指针的地址为何不同

xyq002444 2010-07-27 09:36:21

int main(void){
const char *firstday = NULL;
const char *seconday = NULL;
printf("%x, %x\n", &firstday, &seconday);
return 0;
}

声明两个指向NULL的指针,
对两个指针取地址
为什么两个指向NULL的指针,地址是不同的?
打印出来:bffff61c, bffff618
...全文
724 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
DayDayUpCQ 2010-07-28
  • 打赏
  • 举报
回复
指针本身也是变量,NULL只是变量里面的存储内容,&fir.. 取的是变量的地址,所以两个值是不同的。
michael122 2010-07-28
  • 打赏
  • 举报
回复
1L正解
yiruirui0507 2010-07-28
  • 打赏
  • 举报
回复
指针本身的地址和指针指向的地址是不同的.
偶是江湖中人 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 winner8080 的回复:]
你烦了经典错误.

指针本身的地址和指针指向的地址是不同的.

你这里指针指向的地址是NULL,
但是指针本身是个变量,都有自己的地址,当然不同了.

这里你打印的是指针本身的地址.
[/Quote]
说得这么经典
学习了
FengRider 2010-07-28
  • 打赏
  • 举报
回复 1
9楼的,闭嘴!看得我实在是烦了,实在是忍不住了。丫你汇编在牛,能用汇编把所有的活干完。C/C++不是汇编!编程,思想的重要性你知道不知道。你以为就是几个寄存器寄存过来,寄存过去那么简单,那还要C/C++语言干嘛,还要JAVA语言干嘛,还要Erlang语言干嘛。各语言的魅力,绝不是你简单复制几句话就能说清楚。

楼主的问题很好解释,C/C++里面,每个变量都有两个值,一个叫左值,又叫地址值,意思这个变量在内存中存放的地址;另外一个叫右值,又叫数据值,意思是保存在地址值里面的数据。
数据是可以相同的,但地址是惟一的。
如果地址相同,那么肯定是同一个变量了。
指针变量也是变量,每个指针变量都有其自己的内存空间,你每定义一个指针变量,系统都会为其开辟一段空间,特殊的地方在于,指针变量的数据空间里面存放的数据,是由地址组成,所以才会出现两个指针虽然其数据值都为NULL,但它们自身的地址却各不相同。
zhangweiit 2010-07-28
  • 打赏
  • 举报
回复
你打印出来的是打针变量的地址
每个变量分配的地址当然不一样了

要明白,指针变量的地址,与指针指向的地址,是不一样的

好比,我站在一个地方,这是一个地址
我手指向另一个地方,那是另一个地址
我就是指针
zh848024897 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 winner8080 的回复:]
你烦了经典错误.

指针本身的地址和指针指向的地址是不同的.

你这里指针指向的地址是NULL,
但是指针本身是个变量,都有自己的地址,当然不同了.

这里你打印的是指针本身的地址.
zhonghao4567 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 winner8080 的回复:]
你烦了经典错误.

指针本身的地址和指针指向的地址是不同的.

你这里指针指向的地址是NULL,
但是指针本身是个变量,都有自己的地址,当然不同了.

这里你打印的是指针本身的地址.
[/Quote]

顶!
zhonghao4567 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 brookmill 的回复:]
printf("%x, %x\n", &firstday, &seconday);
你这是打印的两个变量的地址。指针也是变量,它也是需要一个地址来保存的。
要看指针的值 printf("%p, %p\n", firstday, seconday);
[/Quote]


顶!
canshui 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xyq002444 的回复:]
引用 9 楼 zhao4zhong1 的回复:

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

说了和没说一样
[/Quote]\
这位大牛你就听听我们小白的心声吧!
要不,你费心教教咱!!
看你回的那么多帖子,都快把我打击死了……
ForestDB 2010-07-27
  • 打赏
  • 举报
回复
那是两个不同的变量,故地址不同。
但它们指向同一个内存区域,NULL。
aioliads3 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xyq002444 的回复:]

引用 9 楼 zhao4zhong1 的回复:

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!

说了和没说一样
[/Quote]顶!
mousetec 2010-07-27
  • 打赏
  • 举报
回复
int main(void){
const char *firstday = NULL;
const char *seconday = NULL;
printf("%x, %x\n", firstday, seconday);
return 0;
}
wyz007134 2010-07-27
  • 打赏
  • 举报
回复
int a = 0;
int b = 0;
int c = a;
printf("%x, %x, %x\n", &a, &b, &c);
pengzhixi 2010-07-27
  • 打赏
  • 举报
回复
你打印的是指针变量本身的地址,而非指针里面包含的地址,如果要打印指针里面包含的地址值
printf("%d",firstday);
damon1118 2010-07-27
  • 打赏
  • 举报
回复
你可以这样理解:
const char *firstday = NULL;
const char *seconday = NULL;
这两句相当于将两块不同地址中的内容清空。
即地址不同,内容可以相同;同理,内容相同,可以分配到不同的地址中去。
DBTreasure 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bobo364 的回复:]
指针指向内容的地址,指向空也是有内存地址的吧,只不过是随机地址而已


C/C++ code
#include<stdio.h>
int main()
{
char *firstday ;
char *seconday ;
printf("%x,%x\n",firstday,seconday);//指针指向内容的地址,指向空也是有内存地址的吧,只不过是随机地址而已
prin……
[/Quote]

指针确实得理解得比较清楚。
yxl_xx 2010-07-27
  • 打赏
  • 举报
回复
哈哈 肯定不同
因为你指针地址就不同
一个指向firstday
另一个指向seconday
而NULL只是这两个地址的初始值
bobo364 2010-07-27
  • 打赏
  • 举报
回复
指针指向内容的地址,指向空也是有内存地址的吧,只不过是随机地址而已

#include<stdio.h>
int main()
{
char *firstday ;
char *seconday ;
printf("%x,%x\n",firstday,seconday);//指针指向内容的地址,指向空也是有内存地址的吧,只不过是随机地址而已
printf("%x,%x\n",&firstday,&seconday);//指针本身的地址
system("pause");
return 0;
}
xyq002444 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhao4zhong1 的回复:]

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
[/Quote]
说了和没说一样
加载更多回复(15)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧