返回信息流程序如下:
#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
这怎么解释啊?
这是一条镜像帖。来源:北邮人论坛 / soft-design / #22015同步于 2007/10/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
求助:奇怪的指针,请高人解释一下
ryn321
2007/10/30镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
这就是char* 和char[]的区别了
首先
const char *example3="abc";
const char *example4="abc";
char *example5="abc";
char *example6="abc";
这四个其实加不加const没多大区别,用这种方式定义的字符串是存放在静态存储区中的,然后由char*的指针(32位)指向。。。所以是不可写的。。。
一般情况下。。。编译器会优化。。。将所有用char *初始化的同一内容指向静态存储区的同一地址。。。所以反汇编的结果会发现example3~6所指向的地址是一样的。。。
char[]后面的字符数组是存放在栈(stack)中的,可写。。。同时在数据段有一个只读的备份。。。反汇编一下就可以看到了。。。所以自然不同的值得有不同的地址。。。
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()
: ...................
gcc确实是这么实现的
不过这个问题也确实是undefined :P
char *aa="aaa"实际会做一个array to pointer的conversion
这种做法完全是为了老式C的兼容,在ISO中被明确的deprecate
【 在 CNLAS (Ich gewinne bestimmt……) 的大作中提到: 】
: 这就是char* 和char[]的区别了
: 首先
: const char *example3="abc";
: ...................
如果比较example3和example5
发现也是相同的。
即
cout<<(example3==example5); 会输出 1。
编译器好辛苦,把"abc"看成一个整体来看待。
(const) char * example3,4,5,6是4个局部变量,
其值用"abc"这个东西来赋,那显然就是一样的了。
在只读存储的位置中,只有一份"abc".而4个局部变量的值
都是这同一份"abc"的起始地址。故相同。