如何用指针数组和数组指针来表示二维数组?

描述

如何用指针数组和数组指针来表示二维数组?

今天来给大家分享一道经典的笔试题。

C语言  

a是一个二维数组,3 行 4 列,一共 12 个元素。

p是个数组,数组里面元素个数不详,每个元素都是整型指针。

那么它应该如何初始化?

首先,既然是数组,初始化一定需要一个大括号,然后里面填上多个整型指针。

 

int *p[] =  {};
那在二维数组中,能不能找到int *类型的数据?

肯定是有的。

在二维数组中,无非有这么几种写法:
a;
a[0];
a[0][0];
&a;
&a[0];
&a[0][0];
数组名肯定不对,它是一个二级地址;

&a更不对,它是三级地址;

a[0][0]是个具体的元素,跟地址没有关系。

C语言  

剩下的就是a[0]和&a[0][0]。

其实这两个的含义一样,都表示第一行第一个元素的地址,既然是元素的地址,那肯定就是int *类型。

于是p的初始化就可以写成:
int *p[] = {a[0], a[1], a[2]};
分别是第一行、第二行、第三行首元素的地址。

而p后面的中括号也可以写上3,表示数组有3个元素。
int *p[3] = {a[0], a[1], a[2]};
内存模型画出来就是这样的,数组p包含三个指针,每个指针都指针二维数组每行的第一个元素。

C语言

再来看q。

C语言  

q是个指针,指向数组,而且是个一维数组,因为只有一个中括号,但是数组有几个元素不详,每个元素都是整数。

那数组a中有没有一维数组数组呢?

当然有的,我们刚接触二维数组的时候,老师就跟我们说过,二维数组就是由多个一维数组组成,第一行是个一维数组,第二行也是一个一维数组。

C语言  

那我们只要把第一行的地址赋值给q就行。

于是可以把q初始化成:
int (*q)[] = a;
a表示数组第一行的地址,所以q后面的中括号也能顺理成章的写成4,因为一维数组有4个元素。
int (*q)[4] = a;
q的含义和a是一样的,表示数组第一行的地址,q加一,就指向数组的下一行。

C语言  

这个就是C语言里面的指针数组和数组指针,怎么样,迷糊了没?

 




审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分