字符数组和字符指针在分配内存时的差别

来源:互联网 发布:淘宝北京天时恒生假表 编辑:程序博客网 时间:2024/05/02 01:01

 char str1[]="abc";
 char str2[]="abc";
 char str3[]="abc";
 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; // 输出什么?

 

答案:FALSE,FALSE,TRUE。

 

原因:

  (1)系统为字符数组另外分配一块内存,并将“abc”存入这块内存,不管是不是const数组都是这样;

  (2)而为const char* 仅分配一块存放其指针的内存,并不分配一块长度为4的内存空间来存放“abc”。=号后“abc”以常量形式存于静态数据区,而指针自己仅是指向该区首地址的指针。因此所有字符指针的内容(字符串“abc”在静态数据区的首地址)都相同,故str5==str6为真。不管是const char* 还是char* ,都一样。

 注意:

  (1)字符指针本身的存放地址是不同的,即&str5==&str6 为假。

     

  (2)想查看字符数组首地址具体是什么,即str1表示的地址是多少,可以cout << ( int*)str1<< endl,或者cout << &str1<< endl;不能直接cout << str1<< endl; 这样输出的是字符串“abc”。

       而想要通过字符指针查看字符串首地址,即str5指向的地址是多少,只能cout << ( int*)str5<< endl;不能cout << &str5<< endl,这样输出的是str5这个指针存放的地址;也不能直接cout << str5<< endl; 这样输出的是字符串“abc”。