无法理解C++二级指针操作字符指针数组程序的运行结果差异
问题复现
你提供的可正常打印全部字符串的代码如下:
#include<iostream> using namespace std; char* str[] = {"Man", "Woman", "Car", "Plane", 0}; int main() { char** cp = str; while(*cp != 0) cout << *cp++ << endl; return 0; }
将输出语句中的*cp++替换为**cp++后仅能输出每个字符串首字母,差异原因如下:
原因分析
- 先明确各变量的类型定义
str是char*类型数组,每个元素存储对应字符串常量的首地址,最后一个元素为0(空指针)作为循环终止标记cp是char**类型,即指向char*指针的指针,初始化时指向str数组的第一个元素
- 运算符优先级说明
后置自增运算符++的优先级高于解引用运算符*,因此*cp++等价于*(cp++),**cp++等价于*(*(cp++)) - 两种写法的执行逻辑差异
- 使用
*cp++的情况cp++会先返回cp的当前值,再将cp本身自增,指向str数组的下一个char*元素。对返回的原cp值做一次解引用,得到的是str数组当前位置存储的char*类型的字符串首地址,cout接收char*类型参数时,会自动从该地址开始逐个输出字符,直到遇到字符串结束符\0,因此可以完整打印整个字符串。 - 使用
**cp++的情况
同样先执行cp++返回原cp值,第一次解引用得到字符串首地址(char*类型),第二次解引用则会取到该首地址指向的第一个char类型的字符,也就是每个字符串的首字母。cout接收char类型参数时只会输出单个字符,因此最终只会打印每个字符串的首字母。
- 使用
内容的提问来源于stack exchange,提问作者Harrison wells
相关产品推荐
相关产品推荐

