C语言中数组与指针的通俗理解
记住以下关于指针和数组的五句话,基本就能理解数组和指针的转换关系。
1)一重指针指向普通变量;二重指针指向一重指针;三重指针指向二重指针;
2)指针可以通过左取* 或者右取[]来解引用;
3)数组名是指向首元素的指针;
4)一维数组是同类型变量的集合;二维数组是一维数组的集合。
5)指针总可以通过不断添加[]来解引用,直到去掉所有*;数组只能通过添加一个*同时去掉一个[],来变成对应的指针。
1、一重指针指向普通变量:
char ch = a;
char *p = &ch; ------->*p == p[0] =a;
2、数组名是指向首元素的指针:
也就是说也仅仅是指向一个元素,故本质上也是一重指针指向普通变量;只不过,指向数组首元素的话,可以通过指针的位移,来指向数组中的其他单个元素。
char ch[] = {a, };-----------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, };
char ch2[] = {b, };
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, };
char ch1[] = {a, }; char ch2[] = {b, }; char* ch[]={ch1,ch2};
6、二维数组是一维数组的集合 //本质也是变量的集合。
char ch1[] = {a, }; char ch2[] = {b, }; char ch[2][2]={ {a, },{b, }}
由上图可以看出:二维数组的实质其实是一维数组的拼接,里面的元素都是char 类型。 正确赋值方法如下,
这与下图中的一维数组是不同的。
举例:
定义字符串二维数组:
char ch[][10]={ "hello", "world" };
1)省略了行数;
2)字符串中不足列数个的情况,默认会被补零。
7、指针可以通过左取* 或者右取[]来解引用-----参照文中示例带箭头的加粗示例。