C语言中数组与指针的通俗理解
记住以下关于指针和数组的五句话,基本就能理解数组和指针的转换关系。
1)一重指针指向普通变量;二重指针指向一重指针;三重指针指向二重指针;
2)指针可以通过左取* 或者右取[]来解引用;
3)数组名是指向首元素的指针;
4)一维数组是同类型变量的集合;二维数组是一维数组的集合。
5)指针总可以通过不断添加[]来解引用,直到去掉所有*;数组只能通过添加一个*同时去掉一个[],来变成对应的指针。
1、一重指针指向普通变量:
char ch = 'a';
char *p = &ch; ------->*p == p[0] ='a';
2、数组名是指向首元素的指针:
也就是说也仅仅是指向一个元素,故本质上也是一重指针指向普通变量;只不过,指向数组首元素的话,可以通过指针的位移,来指向数组中的其他单个元素。
char ch[] = {'a','\0'};-----------ch 等于 &ch[0] ------->*ch==ch[0]=='a'
小结:一重指针可以指向一个普通变量,也可以指向一个一维数组(本质上也是指向一个普通变量)
举例:当数组元素为char *时,
一维数组形如:
char ch1 = 'a';
char ch2 = 'b';
char* ch[2] ={&ch1,&ch2}; -------->ch[0]==*ch==&ch1; ch[0][0]==*ch[0]=='a'
或者:
char ch1[] = {'a','\0'};
char ch2[] = {'b','\0'};
char* ch[2] ={ch1,ch2}; ------>ch[0][1] ==*(ch[0]+1)==(*ch)[1]==*((*ch)+1)
3、二重指针指向一重指针
char ch1 = 'a';
char *p= &ch1;
char **ch = &p; -------->ch[0][0]== (*ch)[0]=='a'
或者
char *ch1[] = {"hello","world"};
char **ch = ch1; ------------->ch[1][0] == *(ch+1)[0]=='w'
小结:二重指针指向一重指针变量或者一重指针数组(首元素)
二重指针本质上还是指向一个变量,只不过这个变量是个指针。
4、三重指针指向二重指针
char ch1 = 'a';
char *p = &ch1;
char **q= &p;
char*** ch= &q; ------> ch[0][0][0] == *ch[0][0]=='a'
或者 指向一个二重指针数组
char *str1[] = {"hello","world"};
char *str2[] = {"nihao","shijie"};
char **str[]={str1,str2};
char ***ch = str; ------->ch[1][0]=="nihao"
注意:以下直接对数组名取地址,,获取的是一个数组指针。并不是一个二重指针
小结:三重指针本质上还是指向一个变量,只不过这个变量是个二重指针或者是个二重指针数组(首元素)。
5、一维数组是变量的集合
变量可以是char ,也可以是char*
char ch[]={'a','\0'};
char ch1[] = {'a','\0'}; char ch2[] = {'b','\0'}; char* ch[]={ch1,ch2};
6、二维数组是一维数组的集合 //本质也是变量的集合。
char ch1[] = {'a','\0'}; char ch2[] = {'b','\0'}; char ch[2][2]={{'a','\0'}{'b','\0'}}
由上图可以看出:二维数组的实质其实是一维数组的拼接,里面的元素都是char 类型。 正确赋值方法如下,
这与下图中的一维数组是不同的。
7、指针可以通过左取* 或者右取[]来解引用-----参照文中示例带箭头的加粗示例。