C/C++基础知识解惑

kewenliang
C/C++基础知识解惑

char *p="abcd";
char  b[]="abcd";

请问p==b吗?为什么?

cugb_cat
不等,原因请在本版精华区搜索。

scutan
printf("%x, %x/n", p, b); 就可以看到结果了。

实际上,p是一个指针,它指向一个"abcd"的字符串
而b是一个数组,它是在栈上开辟的一个空间,这个空间由"abcd"这个字符串来填充。

kewenliang
[quote]原帖由 [i]scutan[/i] 于 2008-6-19 15:29 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8620917&ptid=1164718][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
printf("%x, %x/n", p, b); 就可以看到结果了。

实际上,p是一个指针,它指向一个"abcd"的字符串
而b是一个数组,它是在栈上开辟的一个空间,这个空间由"abcd"这个字符串来填充。 [/quote]


是不是么回事:char *p="abcd",此处的abcd是在堆内存中的,而char b[]="abcd"是填充在栈空间的,
所以两者的内存地址不相等。
可以这样理解吗?

yecheng_110
[quote]原帖由 [i]kewenliang[/i] 于 2008-6-19 15:21 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8620853&ptid=1164718][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
char *p="abcd";
char  b[]="abcd";

请问p==b吗?为什么? [/quote]
LZ是为了研究吗?
如果不是为了研究
好像没有地方会关心这个问题

scutan
回复 #4 kewenliang 的帖子

嗯。差不多吧,但对于char *p="abcd"中的"abcd"不是在堆中,而是在常量区,详情可以查看APUE2第7章的进程内存映像。另外,深入理解计算机系统也可以看看。

kewenliang
[quote]原帖由 [i]yecheng_110[/i] 于 2008-6-19 15:38 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8621007&ptid=1164718][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]

LZ是为了研究吗?
如果不是为了研究
好像没有地方会关心这个问题 [/quote]


不是为了研究  就是突然发现这个问题  以前总是认为两者是相等的

figure_hit
回复 #1 kewenliang 的帖子

任何编译器都不会做那样的优化,省下那么点内存的。

ruoyisiyu
我看还是搜一下帖子了,既然碰到了就要搞明白了,不能似是而非,不然以后很容易犯错误的

獨照づ幔紗
p=&b[0]

Cyberman.Wu
[quote]原帖由 [i]kewenliang[/i] 于 2008-6-19 15:35 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8620975&ptid=1164718][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]



是不是么回事:char *p="abcd",此处的abcd是在堆内存中的,而char b[]="abcd"是填充在栈空间的,
所以两者的内存地址不相等。
可以这样理解吗? [/quote]

b是在栈里面的,而p指向的字符串实际上一般在数据段或只读的数据段,不会在栈空间。这两者的区别主要是注册一些字符串,如PCI驱动的名称,如果指向一个临时数组到访问时数据已经不存在了。

kewenliang
[quote]原帖由 [i]Cyberman.Wu[/i] 于 2008-6-20 06:11 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8623933&ptid=1164718][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]


b是在栈里面的,而p指向的字符串实际上一般在数据段或只读的数据段,不会在栈空间。这两者的区别主要是注册一些字符串,如PCI驱动的名称,如果指向一个临时数组到访问时数据已经不存在了。 [/quote]

恩  对

道理是这样的

平常读程序或者写程序的时候一般不考虑这些,只管程序字面含义,程序在计算机内部的存储结构等模模糊糊的

什么时候才能达到 当看见一段代码时 它的内部细节,存储结构等等 都了然于胸呢?

ruoyisiyu
[quote]原帖由 [i]kewenliang[/i] 于 2008-6-20 09:22 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8624440&ptid=1164718][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]


恩  对

道理是这样的

平常读程序或者写程序的时候一般不考虑这些,只管程序字面含义,程序在计算机内部的存储结构等模模糊糊的

什么时候才能达到 当看见一段代码时 它的内部细节,存储结构等等 都 ... [/quote]
多写代码(不是滥写)+操作系统+编译原理+汇编+领悟

kewenliang
回复 #13 ruoyisiyu 的帖子

编译原理 不敢碰啊  看过一阵子   学不会啊
汇编也不太熟