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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值