二级数组的深入理解

本文详细介绍了二维数组的初始化方法,包括使用花括号和默认填充0的情况;阐述了二维数组的内存布局,它是多个一维数组的地址集合;并通过指针模拟二维数组,并讨论了二维数组的传参方式,包括直接传递数组和传递数组指针。
摘要由CSDN通过智能技术生成

1.二维数组的初始化

我们熟悉一维数组的初始化,即

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

而二维数组的初始化和一维数组很像,区别就在一维数组只有一行,而二维数组可以有多行。

int arr[3][5]={1,2,3,4,5,6,7,8,9,10};

上述arr就是我们的二维数组,其类型是int[3][5]。其中3就是行数,5是列数。一般情况下,元素会默认从第一行开始填入,空余的位置会补0。
我们再来看一段二维数组的创建代码

int arr[3][5]={{1,2,3},
				{2,3,4},
				 {3,4,5}}

这样创建的二维数组就是这样的
在这里插入图片描述

2.二维数组的内存

上述二维数组里,我们写入了三个一维数组。而二维数组中,元素的种类其实就是一维数组,如上述arr[3][5]就是由三个 arr[5] 一维数组组成。
我们知道一维数组的数组名一般情况下就是数组首元素的地址。

int arr[5]={1,2,3,4,5};//arr=&arr[0]

而二维数组的数组名也是其首元素的地址,只不过它的首元素是第一行的数组。

int arr[3][5]={{1,2,3},
				{2,3,4},
				 {3,4,5}}//arr=  *{1,2,3}这个数组的地址*

而这三个数组的地址是按下图规律分布的
在这里插入图片描述

我们知道了二维数组存储的是多个一维数组,而我们要获得某个具体的元素,就需要先访问其中的一维数组,进而访问一维数组中的某个元素。而我们对数组的访问,其实是通过其内存内存地址来实现的。
如我们要访问一维数组的某个元素

int arr[5]={1,2,3,4,5};
arr[3]//我们访问第四个元素
//编译器会将arr[3]这个代码转换成  *(arr+3)  ,arr就是首元素的地址(arr+3)就4这个元素的地址

而我们要访问二维数组中的某个元素

int arr[3][5]={{1,2,3},
				{2,3,4},
				 {3,4,5}};
arr[2][1];//编译器会先执行arr[2],即*(arr+2),获得第三行的一维数组,再从一维数组中访问目标元素。				 

通过上述讨论,我们进一步思考,会发现二维数组存储的,可以看作是多个一维数组的内存地址。因此我们可以通过指针模拟二维数组。

int arr1[]={1,2,3};
int arr2[]={2,3,4};
int arr3[]={3,4,5};
int * arr[3]={&arr1,&arr2,&arr3};

3.二维数组的传参

int arr[3][5]={{1,2,3},
				{2,3,4},
				 {3,4,5}}

最容易理解的传参可以写成

void test(int arr[3][5]);

但我们知道二维数组的数组名是它首元素的地址,即第一行数组的地址,因此它传递的也可以是一个数组指针

void test(int (*P)[5]);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值