谈谈字符串常量

来源:互联网 发布:淘宝闲鱼 编辑:程序博客网 时间:2024/05/29 19:06

  昨天上C++选修,老师指出了一个我以前没怎么注意的问题,形如
"char * pStr="Abcd";"的语句中的pStr指向的是字符串常量,所以程序中对pStr指向的区
域只能读,

不能写,否则即算编译成功,也会运行失败。

   刚刚结合网上资料,对这个情况实验了一下,有如下结论,和大家共享下.
1.pStr指向的"Abcd"是字符串常量,编译后存放在内存中的数据区(即存放全局变量和静态局
部变量的地

方)
2."Abcd"的存放位置和静态局部变量一致,其生存期也和静态局部变量一样具有程序生存期
(事实上生存

期和存放区域是对应的)。不过与静态全局变量不同的是,它是只读的。

3."Abcd"这个字符串应与"const char pStr2[]="Abcd"与以区分,后者有可能是存放在栈区
(auto变量

就放在这里),当然有些编译器对const作了优化,也有放其他地方的.

 由上述结论应该可以很快推出下面测试程序的结果


#include<iostream>
using namespace std;
char * test();
int main()
{
    char * p=test();
    cout<<p<<endl<<hex<<(unsigned int)p<<endl;
    return 0;
}

char * test()
{
    char  * str1="I Want To Get The Answer.";
    char * str2="I Want To Get The Answer.";
    char * str3="I Want To Get The Answer.";
    char str4[]="I Want To Get The Answer.";
    char str5[]="I Want To Get The Answer.";
    cout<<hex<<(unsigned int)str1<<','<<hex<<(unsigned int)str2<<','/
      <<hex<<(unsigned int )str3<<','<<hex<<(unsigned int)str4<<','/
       <<hex<<(unsigned int )str5<<endl;
      return str1;
}

输出是(vc6.0)
46f02c,46f02c,46f02c,12fefc,12fee0
I Want To Get The Answer.
46fc02c

可以看到
1.str1,str2,str3这三个地址指针的值一样,而后面两个指针地址值相异。为什么这样?从
前文中可找

到答案。
2.cout<<p能通过编译,是因为“p=test()”;接收到的是一个具有程序生存期的内存空间指
针。

原创粉丝点击