C++字符数组与字符指针在运算时的区别

char *strPtr = “HELLO “;
char str[] = “HELLO “;
*(strPtr + 1) = ‘B’; // 出错
*(str + 1) = ‘B’; // 正常执行
原因分析如下:
“HELLO”在内存中的存储形式:

指针变量strPtr在内存中的存储形式:(前面是内存的地址)
在这里插入图片描述
冒号前面是内存的地址,后面存放的是具体内容。可以看出指针变量存储的是"HELLO “的第一个字母的内存地址。
str数组在内存中的存储形式:
在这里插入图片描述
冒号前面是内存的地址,后面存放的是具体内容。可以看出字符数组中的每个元素存储的是"HELLO “的每个字母的内存地址。
1,printf(”%xd\n”, &strPtr); // 输出结果为:0x00C17BF0
2,printf(”%xd\n”, strPtr); // 输出结果为:0x00907BF0
3,printf(”%xd\n”, &str); // 输出结果为:0x001BA9F0
4,printf("%xd\n", str); // 输出结果为:0x001BA9F0

上述1和2中输出的结果不同是因为strPtr是一个变量,变量名作为表达式时实际是取这个变量中所存取的值。所以1是输出strPtr这个变量的地址,而2是输出strPtr这个变量存取的值。而3和4输出的结果相同是因为str只是数组名称并不是一个变量。而数组名称作为表达式时表示的就是这个数组第一个元素的地址。而&str表示的是整个数组在内存中占用的地址。它是一个指针数组,即char (*strArray)[6] = &str;strArray中的每个元素存取的值就是str这个数组各个元素的内存地址。这里输出时由于没有指定输出哪个元素,所以默认输出了strArray的第一个元素。因此它与4的输出结果相同。

从上可以看出,对数组str进行的运算实际是对其自身的内存地址进行的运算。即str+1实际是获取了str这个数组的第2个元素的地址,而不是这个数据的第2个元素所存取的地址。获取的结果为0x001BA9F1。而对指针strPtr进行的运算实际是对其所存储的内存地址进行的运算。即strPtr+1实际是获取的其存储的内存地址进行加1。获取的结果为0x00907BF1。所以,*(str + 1) = ‘B’;操作实际只是改变了0x001BA9F这个地址中所存取的

值,而*(strPtr + 1) = ‘B’;则是要改变0x00907BF1这个地址中所存取的值。而0x00907BF1这个地址中存取的是字面量的值,即常量的值,是不允许修改的。所以,执行*(strPtr + 1) = ‘B’;操作时会出错。
数组名str代表的是数组的首地址,是一个常量,所以对其进行str++会出错。因为不能改变一个常量的值。而指针strPtr是一个变量,所以可以进行strPtr++操作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值