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

 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”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值