我无法跟踪指向指针数组程序的指针


#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++时,我只得到M,W,C, p这样的首字母。

对于初学者来说,数组应该用限定符const来声明,因为在c++中字符串字面量有常量字符数组的类型。

const char* str[]={"Man","Woman","Car","Plane",0};

实际上上面的声明等价于

const char* str[]={ &"Man"[0], &"Woman"[0], &"Car"[0], &"Plane"[0], 0 };

,因为具有数组类型的字符串字面值在此声明中被隐式转换为指向其第一个元素的指针。

在这个声明中

char** cp=str;

也应该写成

const char** cp=str;

指针cp指向char *类型数组的第一个元素,并指向字符串字面值"Man"的第一个字符。

*cp一样对指针cp解引用一次,您将获得指针类型为char *的数组的第一个元素,该元素指向字符串字面值"Man"的字符'M'。第二次像**cp那样对指针解引用,你会得到一个类型为char的对象,它包含了字符'M'