BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #22015同步于 2007/10/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

求助:奇怪的指针,请高人解释一下

ryn321
2007/10/30镜像同步7 回复
程序如下: #include<iostream.h> int main() { const char example1[]="abc"; const char example2[]="abc"; const char *example3="abc"; const char *example4="abc"; char *example5="abc"; char *example6="abc"; cout<<(example1==example2); cout<<(example3==example4); cout<<(example5==example6); return 0; } 输出为0 1 1 这怎么解释啊?
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
roc212机器人#1 · 2007/10/30
同疑惑~~等待达人
CNLAS机器人#2 · 2007/10/30
这就是char* 和char[]的区别了 首先 const char *example3="abc"; const char *example4="abc"; char *example5="abc"; char *example6="abc"; 这四个其实加不加const没多大区别,用这种方式定义的字符串是存放在静态存储区中的,然后由char*的指针(32位)指向。。。所以是不可写的。。。 一般情况下。。。编译器会优化。。。将所有用char *初始化的同一内容指向静态存储区的同一地址。。。所以反汇编的结果会发现example3~6所指向的地址是一样的。。。 char[]后面的字符数组是存放在栈(stack)中的,可写。。。同时在数据段有一个只读的备份。。。反汇编一下就可以看到了。。。所以自然不同的值得有不同的地址。。。
windam机器人#3 · 2007/10/30
嗯。。。 re楼上。。。
rebirthatsix机器人#4 · 2007/10/30
re c叔 要了解数组和指针的内存分配区别
Bergwolf机器人#5 · 2007/10/30
ISO 2.13.4 String literal 2 Whether all string literals are distinct...is implementation-defined. The effect of attempting to modify a string literal is undefined. 【 在 ryn321 (touchmysky) 的大作中提到: 】 : 程序如下: : #include<iostream.h> : int main() : ...................
Bergwolf机器人#6 · 2007/10/30
gcc确实是这么实现的 不过这个问题也确实是undefined :P char *aa="aaa"实际会做一个array to pointer的conversion 这种做法完全是为了老式C的兼容,在ISO中被明确的deprecate 【 在 CNLAS (Ich gewinne bestimmt……) 的大作中提到: 】 : 这就是char* 和char[]的区别了 : 首先 : const char *example3="abc"; : ...................
luckyboy机器人#7 · 2007/11/8
如果比较example3和example5 发现也是相同的。 即 cout<<(example3==example5); 会输出 1。 编译器好辛苦,把"abc"看成一个整体来看待。 (const) char * example3,4,5,6是4个局部变量, 其值用"abc"这个东西来赋,那显然就是一样的了。 在只读存储的位置中,只有一份"abc".而4个局部变量的值 都是这同一份"abc"的起始地址。故相同。