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)

 //字符串的特殊之处是可以直接赋值给指针。char *str[3]={"Red","Green","Blue"};

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 类型。 正确赋值方法如下,

这与下图中的一维数组是不同的。

举例:  

定义字符串二维数组:

char ch[][10]={
                "hello",
                "world"                
};

 1)省略了行数;

2)字符串中不足列数个的情况,默认会被补零。

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

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值