这两种声明方式的区别: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”。