char* pstr = “hello,world“ 与 char str[20] = “hello, world“ 的区别

这两种声明方式的区别:pstr 指向的内容无法被修改,但是str 指向的内容可以被修改

下面通过两组测试来验证

1、char* pstr = "hello,world"

char* pstr = "hello,world";
*pstr = 'H';

编译的时候会报如下错误:

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

char* pstr = “hello,world“ 与 char str[20] = “hello, world“ 的区别_第1张图片

 

2、char str[20] = "hello, world" 

char str[20] = "hello, world";
*str = 'H';
printf("%s\n", str);

 打印结果如下:

char* pstr = “hello,world“ 与 char str[20] = “hello, world“ 的区别_第2张图片

值得注意的是,并不是说换了一种声明方式,“hello, world” 就不是常量了,此时“hello, world”依然在常量区。

  • 第一步,赋值的时候是从右往左执行的,所以是先在常量区创建一个常量叫做 "hello, world";
  • 第二步,在栈上创建一个数组,数组名为str,数组大小为20个字节;
  • 第三步,将"hello, world"从常量区拷贝一份,拷贝到刚刚创建好的str数组中。

所以实际上我们修改的是栈上字符串“hello, world”,而不是常量区的字符串“hello, world”。

char* pstr = “hello,world“ 与 char str[20] = “hello, world“ 的区别_第3张图片

你可能感兴趣的:(C语言,c++,开发语言)