C/C++里的const(1)

时间:2023-03-08 15:48:39

首先来看这样一段程序:

 #include<iostream>
using namespace std;
int main(){
char *s = "hello world"; cout << s << endl;
s[] = 'B';
cout << s << endl;
return ;
}

在VS2013下编译运行的结果是:

C/C++里的const(1)

C/C++里的const(1)

什么原因呢?

计算机中的内存在用于编程时,被进行了分区(Segment),分为:“栈区”(Stack)、“堆区”(Heap)、全局区(静态区,Static )、文字常量区和代码区。

C/C++里的const(1)

使用*s定义的字符串存储在文字常量区内,这一部分是默认为为const类型的,因此不能修改。

当把程序改成如下,就可以得到想要的效果了。

 #include<iostream>
using namespace std;
int main(){
//char *s = "hello world";
char s[] = "hellow world";
cout << s << endl;
s[] = 'B';
cout << s << endl;
while ();
return ;
}

运行结果:

C/C++里的const(1)

通过打印一下两种方式的字符串首地址,跟容易发现问题所在。

修改后的程序:

 #include<iostream>
using namespace std;
int main(){
char *s1 = "hello world";
char s2[] = "hellow world";
cout << &s1 << endl;
//s[0] = 'B';
cout << &s2 << endl;
cout << &main << endl;
while ();
return ;
}

运行结果:

C/C++里的const(1)

可以发现由字符串定义的字符串被放到了很靠前的地址空间(栈区);而由指针定义的字符串与main函数地址很近。