0、前言 指针可以指向一个变量,也可以指向一个同类型的数组。 指针总可以通过添加[]来进行解引用。 指针与数组是相通的。在分析变量数据类型的时候,可以通过相通性来理解: char *str ------------> char ch[]; 指针可以去掉*,添加[];--->所以,指针可以赋值为数组名; char ch[]------------> char *str ; 数组名去掉[],添加*;-------->所以,数组名是个地址。 1、char*的使用 //char*对应char变量的地址外,还 //一重指针对应的是一维数组 char str[] = "hello"; char* ch = str; //ch等同于str printf(" %s",ch); 2、char**的使用 char**对应char* 变量的地址外,还//二重指针对应的是指针数组,而不是二维数组。 char *str[] = {"hello","world"}; char **ch = str ; //ch等同于str printf("%s\n",ch[0]); printf("%s\n",ch[1]); 小结: char** ch ,通过添加一个[]解引用,去掉一个*,---------------->char *str[];--------->str[]显示为字符串 char *str[],通过添加一个[]解引用,去掉一个*,--------------->char st[][];--------->st[][] 显示为字符。 ps:通过这种方式可以查看变量的数据类型。 ****************************************************************************** 以上也可以写成: char str[][6] ={"hello","world"}; 方法一:使用数组指针指向二维数组:char (*ch)[6] = str; //数组指针对应的才是二维数组 方法二:使用指针数组分别指向二维数组中的各个一维数组: char *ch[2]; ch[0] = str[0]; ch[1] = str[1]; 3、char***的使用 总的思路:通过一步一步替换的方法,还原到最终的结果。 1)char*** 对应char**的地址; //char***对应二重指针的地址 char *str[] = {"hello","world"}; char **data = str; //data与str等同 char ***mm = &data; //mm[0]等同于data printf("%s\n",mm[0][0]); printf("%s\n",mm[0][1]); 分析: char ***mm = &data; 所以mm[0]等同于data; char **data = str; data等同于str;所以,str等同于mm[0] char *str[] = {"hello","world"}; 所以,str[0]等同于 mm[0][0];str[1]等同于mm[0][1]; 2)char*** 对应 char** ch[]; //char***对应二重指针数组 //因为char** 指向的是char* ch[]; char *str1[] = {"hello","world"}; char *str2[] = {"nihao","shijie"}; char **ch[]={str1,str2}; //str1等同于ch[0],str2等同于ch[1] printf("%s\n",ch[0][0]); printf("%s\n",ch[0][1]); printf("%s\n",ch[1][0]); printf("%s\n",ch[1][1]); printf("**************************\n"); char ***str = ch; //str与ch等同 printf("%s\n",str[0][0]); printf("%s\n",str[0][1]); printf("%s\n",str[1][0]); printf("%s\n",str[1][1]); 分析: a) char **ch[]={str1,str2}; 所以,ch[0]等同于str1;ch[1]等同于str2; char *str1[] = {"hello","world"}; 所以str1[0]等同于ch[0][0],str1[1]等同于ch[0][1] char *str2[] = {"nihao","shijie"}; 所以str1[0]等同于ch[1][0],str1[1]等同于ch[1][1] b)char ***str = ch; 所以,str等同于ch .str[0]等同于ch[0],等同于str1; str[1]等同于ch[1],等同于str2 str[0][0] 等同于ch[0][0],等同于str1[0];str[0][1] 等同于ch[0][1],等同于str1[1] str[1][0] 等同于ch[1][0],等同于str2[1];str[1][1] 等同于ch[1][1],等同于str2[1] 小结: char*** str 通过一个[]解引用,可以去掉一个* ------------------>char **ch[]--->ch[]为一个二重指针 char **ch[] 再通过一个[]解引用,又去掉一个* ------------------->char *c[][] ---->所以c[][]是字符串类型。 ps:通过这种方式可以查看变量的数据类型。 4、总结: 指针数组指针char* str char ch[] str = ch; char cc; str = &cc char **str char *ch[] str = ch; char *cc; str = &cc; char ***str char **ch[] str = ch; char **cc; str = &cc; 多维指针与通过添加一个[]解引用的值相对应多维指针与低维指针取地址相对应