这两种声明方式的区别:pstr 指向的内容无法被修改,但是str 指向的内容可以被修改
下面通过两组测试来验证
1、char* pstr = "hello,world"
char* pstr = "hello,world";
*pstr = 'H';
编译的时候会报如下错误:

因为 "hello,world" 是一个常量,存储的时候是被放在常量区的(常量区的内容不可被修改),我们通过指针修改常量区的内容,很显然是不合适的。

2、char str[20] = "hello, world"
char str[20] = "hello, world";
*str = 'H';
printf("%s\n", str);
打印结果如下:

值得注意的是,并不是说换了一种声明方式,“hello, world” 就不是常量了,此时“hello, world”依然在常量区。
- 第一步,赋值的时候是从右往左执行的,所以是先在常量区创建一个常量叫做 "hello, world";
- 第二步,在栈上创建一个数组,数组名为str,数组大小为20个字节;
- 第三步,将"hello, world"从常量区拷贝一份,拷贝到刚刚创建好的str数组中。
所以实际上我们修改的是栈上字符串“hello, world”,而不是常量区的字符串“hello, world”。

本文详细解析了C++中字符指针常量与变量的区别,通过两个示例说明了它们在内存区域和修改权限上的差异。在第一种情况,尝试修改常量字符串会导致编译错误,因为常量存储在不可修改的常量区。而在第二种情况,字符串拷贝到栈上的数组中,修改的是栈上副本而非常量区的原字符串。
3532

被折叠的 条评论
为什么被折叠?



