我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

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

本篇内容介绍了“C++字符数组与字符指针在运算时的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联服务项目包括云州网站建设、云州网站制作、云州网页制作以及云州网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,云州网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到云州省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

char *strPtr = "HELLO ";

char str[] = "HELLO ";

*(strPtr + 1) = 'B'; // 出错

*(str + 1) = 'B'; // 正常执行

原因分析如下:

“HELLO”在内存中的存储形式:

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

 指针变量strPtr在内存中的存储形式:(前面是内存的地址)

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

冒号前面是内存的地址,后面存放的是具体内容。可以看出指针变量存储的是"HELLO "的第一个字母的内存地址。

str数组在内存中的存储形式: 

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

 冒号前面是内存的地址,后面存放的是具体内容。可以看出字符数组中的每个元素存储的是"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++操作。

“C++字符数组与字符指针在运算时的区别是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


网站题目:C++字符数组与字符指针在运算时的区别是什么
文章分享:http://mswzjz.cn/article/ggpjdj.html

其他资讯