各位帅哥靓女们,猪猪又来了,这次我们来聊聊二维数组中的一些小细节,帮助我们彻底理解c语言的二维数组,老规矩,如果各位帅哥靓女们觉得这篇文章对你们有所帮助的话,还请动动小手一键三连,如果猪猪哪里有说错的地方,还请位于评论区斧正。
总所周知,啥是一维?就是简单的线,啥是二维?就是面,故名思意,我们心目中的一维数组和二维数组大概是长这样的:
其实,你也能想象出来,作为一个电脑硬件,存储的时候怎么可能产生一个二维空间来给你存储?二维数组说到底还是一个二级指针。
【一】下标省略问题
众所周知,二维数组定义的时候第一个下标是可以不写的,但是第二个下标不能不写?这个时候就有帅哥要问了,为啥不能两个下标都省略?大哥你如果两个下标都省去,那么你定义的到底是个啥玩意?就是一个单纯的双重解引用的指针?问题你能定义一个解引用的指针吗?答案是否定的!
为啥能省略去第一个下标而不能省去第二个指针呢?我前面说了,这是一个二级指针,如果我省去第一个,可以根据我第二个下标的数量,和我定义出来的整数来计算出第一个下标的值,也就是指针的个数,但是你可以根据指针的个数和总量来计算出每个指针指向的数量大小吗?答案是否定的,第一个指针指向的三个数的数组,第二个指针指向的是两个数的数组,不行吗?这就是二维数组的本质,一个数组指针。
【二】不完全定义问题
我们写一维数组的时候,定义一个数组为10个元素,但是我们定义了五个,剩余的编译器会自动将它初始化为0,如图所示:
但是我们在二维数组中呢?一行不定义会咋样?一行中少少定义一个会咋样?如图所示:
和一维数组一样,你没有定义或者是少定义一个数,编译器也将其初始化为0,这个时候有人要问了,你这是分组定义,如果你不分呢?那会咋样?如图所示:
编译器按照顺序填充,剩下的位置编译器也将其初始化为0。
【三】二维数组本质的问题
上面挖了这么大的坑,我们要填了,二维数组的本质是什么?我个人是这么理解的,是一个指针数组,也就是数组里面存放的是指针,指针指向的是数组,这个何以证明?如图所示:
9697104是数组名也就是数组的首地址,但是按照道理说,首地址加上一不应该是9697108吗?为啥是这个9697116呢?你将他们的插值除3是不是4?这说明了啥?我加上一就跳过了一行,这也从侧面说明了我跳到了第二行的位置,也就是第二个指针指向的位置,那么我们如何证明这个是第二个指针指向的位置呢?如图所示:
所以我们可以这样理解,arr是个指针,指向一个数组,数组里面存放了三个指针,这三个指针也指向了数组。
tips:以上就是猪猪对二维数组全部理解了,老规矩,若是觉得猪猪说的还不错的话,还请各位帅哥靓女们动动小手给猪猪来个一键三连吧,球球了!!!