重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇内容介绍了“C++字符数组与字符指针在运算时的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联公司专注于企业营销型网站建设、网站重做改版、贵港网站定制设计、自适应品牌网站建设、成都h5网站建设、电子商务商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为贵港等各大城市提供网站开发制作服务。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++操作。
“C++字符数组与字符指针在运算时的区别是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。