指针和数组的问题

来源:百度知道 编辑:UC知道 时间:2024/07/09 03:24:35
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout << "boolalpha:" << ( str1==str2 ) << endl;
cout << "boolalpha:" << ( str3==str4 ) << endl;
cout << "boolalpha:" << ( str5==str6 ) << endl;
上面结果输出0 0 1,为什么会这样?
为什么str1,str2,str3,str4地址互不相同,而str5和str6却是同一个地址?可不可以解释一下,谢谢了!

首先,你要理解他的细节过程
对于数组,他是分配内存空间,然后存储内容到这些分配好的空间里
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
上面的,你执行第一句,他就会分配内存空间,然后存储abc\0等,然后要执行第二条语句,因为你的第一条语句执行过后,str1中就存储了第一条语句所分配的内存空间的地址,由于这个地址的内存空间已经被用了,所以在第二条语句执行的时候,上面的那个地址的内存空间已经被分配了,因此自然不能再在执行第二条语句的时候再分配相同地址的内存空间给他,
第三条与第四条语句同理...
因此,上面执行四条语句,都会分配不同的内存空间来存储abc\0,所以内存空间不同,自然他们所表示的地址也是不同的

对于指针,你要知道,他是先定义一个指针变量,用于存储某一内存空间的地址,因此
const char* str5 = "abc";
是先定义一个字符指针str5,然后将字符常量"abc"的首地址赋给他
同理
const char* str6 = "abc";
这个也是将常量"abc"的首地址,因此地址是同一个地址,字符串常量是被编译器优化放在静态只读内存中..懒得打字了,给你个连接看看把
相信看了之后你也就明白了

http://zhidao.baidu.com/question/30755226.html?si=4

这个问题,编译器不同,结果也不尽相同。
但通常会有以上结果。
为什么呢?详情可以看<C语言专家编程