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、指针可以通过左取* 或者右取[]来解引用-----参照文中示例带箭头的加粗示例。

经验分享 程序员 微信小程序 职场和发展