前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >指针与二维数组的结合运用

指针与二维数组的结合运用

原创
作者头像
用户8639654
修改2021-07-26 11:33:46
4370
修改2021-07-26 11:33:46
举报
文章被收录于专栏:云计算运维云计算运维

在学习这一知识点时,我也下了很多功夫,经过反复的思考和查阅,我把我掌握的分享给大家,希望对大家能够有帮助,最后我还出了一些题,能够帮助大家对这一知识点更好的理解。如果有解释不对的地方还请大家指正。不懂的地方可以问我,我会耐心回答的。我能理解求知识的急迫心情。

我们先说一下一维数组和二维数组的区别,从字面上理解,我们可以把他们两个看成维度不同,一维数组只有行,没有列,而二维数组不仅有行而且有列,这就是维度不同的体现,但是他们在储存上是一样的,在存储上都是依次后排。为了便于理解,我们把二维数组在宏观上表示成行和列。

再从它们元素的角度看看他们的差别,一维数组的元素是一个基本数据类型的数。但二维数组的元素是一维数组,是某种基本数据类型的数的集合,不是单独一个。我们可以把二维数组的一行看成一个一维数组。

我们先声明一个二维数组和一个一维数组:

a[3][2] b[2] , 方便下文说明!

有了这些区别,我们把他们和指针放到一起有什么区别那?(数组名也是指针,但它是指针常量,不是指针变量)

1.我们先从数组名入手:一个是a 一个是b。我们知道一维数组名b可以看成一个指针常量,它指向的是一维数组的第一个元素,然后加1是指向第二个元素

2. 那类似的a也是一个指针常量,那么它指向的是谁那?事实上,二维数组名和一维数组名一样指向的也是他的第一个元素,但这里注意,二维数组的每个元素都是一个一维数组。即数组名指向的是一维数组这个一大块(可以从维度的角度理解,一维数组是一维的,数组名指向了 “一个数”, “数”是点,点是0维。而二维数组是二维的,数组名指向了整个一维数组这一大块,这一大块是一行,行是一维的)。

我们在一维数组里知道一维数组名指向的是首元素,首元素是一个整数,浮点数或者字符,只是单独存在的。但是二维数组名指向的也是首元素,但这个首元素是一维数组这个一大块,一维数组可不是一个单独的整数,浮点数或者字符,而是某种这些类型中的一种的集合,一个指针指向一个一维数组这一大块还是第一次见。我们用int *p 指向整数类型,用char *p 指向字符类型,我们用什么指向一维数组这一大块那?我们可以用int *p来指向a的首元素吗?下面是编译器给出的错误~

代码

报错信息

通过错误信息我们知道a的首元素是int[2]型,即我们需要用int(*p)[2] = a才会编译通过 此时我们就知道了让指针p指向二维数组的首元素(首元素是一个一维数组这一大块)的方法了。这个别扭的int(*p)[2]是什么那?这个就是数组指针。这里就要引出数组指针了,数组指针的定义为: 数据类型(*指针名)[该二维数组中一维数组的元素的个数]。通过这样定义可以让指针指向二维数组。这里注意:()不能去掉,因为*的优先级低于[]的优先级。这一点可以参照指针数组与数组指针的区别。

我们可以理解int(*p)[2]这样声明得到的指针p和二维数组名a是一个等级,而b[2]={1,2},int *q = b;这样得到的q和数组名b是一个等级的。

我们知道一维数组的元素是整数,浮点数或字符。二维数组的元素是一维数组。我们怎么表示二维数组中的一维数组这个元素那?事实上,我们用a[0],a[1],a[2]来表示二维数组的元素(一维数组)。这个a[0]不要和一维数组b里面的元素b[0]搞混了。因为a和b的维度不同,可以理解为等级不同。

我们知道*运算符是取指针指向的空间里的值,如int i = 3; int *n = &i; 那么*n的值就是3。b[3]={1,2,3};int *q=b;那么*q是取一维数组b的第一个元素值。*(q+1).是取一维数组b的第二个元素值。这些很好理解。

同样的a[2][3]={1,2,3,4,5,6};int (*p)[3]=a;那么*p也是取二维数组的元素,只不过元素是一维数组这一大块。那么就有*(p+0)=a[0],*(p+1)=a[1]。

另外a[2]中[]运算完全可以理解为*(a+2).另外我们知道一维数组名也可以看成指针,这个指针和指向它的指针区别是一个是变量,一个不是变量。同样的二维数组名也可以看成指针,即int(*p)[2] = a;那么可以把a看做是指针p,只不过a是指针常量,而p是指针变量。那么我们就有这些结论了:p[0][0]==a[0][0],*p=*(p+0)=p[0]=a[0]

现在我们理解了如何用指针指向整个数组了( a[3][2]={1,2,3,4,5,6};int (*p)[2] = a;),通过这个我们就把指针和二维数组联系到了一起。

还要说明的是a[3][2]的一维数组元素名为a[0],a[1],a[2].而一维数组b[2]的数组名名字是b,没有[](我们可以采用刚才*运算和[]运算关系降维来理解这一点)。

下面我们类比一维数组来看看二维数组的什么和一维数组的什么在用法上是相同的

1.元素方面:一维数组的数组名b,和二维数组中的a[0],a[1],a[2]的用法一样 (或等级一样)比如 b[1]是一维数组第二个元素,a[0][1]是第一行第二个元素。

2.地址方面:b+1代表一维数组第二个元素的地址,那么类似的a[0]+1是第一行第二个元素的地址

我们知道了a[0]的意思 现在我们再来说说数组名a的意思 我们知道一维数组名是首元素的地址,同样的a也是首元素的地址,即为二维数组的首行的地址,但是行的地址是什么那?只有是行的首元素的地址了,因为在内存中可以通过首地址找到想找的数据.通过给它行的首地址就能找到这一行了。

a[2][3]={1,2,3,4,5,6};

b[3]={1,2,3};

int (*p)[3] = a;

int *q = b;

printf("%p,%p\n",a,a+1); ①

printf("%p,%p\n",b,b+1);②

printf("%p,%p\n",a[0],a[0]+1);③

printf("%p,%p\n",p,p+1); ④

printf("%p,%p\n",*p,*p+1);⑤

printf("%d,%d",**p,a[0][0]);⑥

printf("%d\n",*(*(p+1)+1),a[1][1]);⑦

printf("%d,%d\n",p[0][0],p[0][1]); ⑧

printf("%d,%d",a[0][0],a[0][1]);⑨

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档