详解二维数组
二维数组的使用规则
一:定义int arr[3];
int brr[3][4];
对比一位数组,二维数组具有行和列两个参数,在定义上,与一维数组相似
数据类型 数组名[行][列];
二:初始化
同样,对于一维数组的初始化,如下所示:
int arr[3] = {1,2,3};
int arr[3] = {1};//其余默认为0
那么,二维数组呢?
二维数组的初始化采用行优先的原则并且,中括号里边只能省略行的值,不能省略列的值。
三:二维数组的打印
打印二位数组,两层for循环,遍历行和列,然后进行打印
直接在主函数中打印:
利用函数调用,打印:
在利用函数调用打印二维数组时,一般我们的参数列表为
void show(int crr[][4],int row,int col)
在这里要注意,二维数组的数组名不是一个二级指针,因此,不可以将参数列写成
void show(int **crr,int row,int col)//error
那么在调用函数中,一维数组的形参列表可以写成(int *arr)指针类型,
那么二位数组呢,接下来我们对比分析一下两者的异同:
一维数组,它的定义为:int arr[4];并且我们可以确定的是:
先来看一维数组,一维数组中的数组名
arr的数据类型为int *
arr+1为int *
arr[0]为int
在二维数组中,int brr[3][4];它的数组名以及以下的数据类型分别为:
brr: int(*p)[4]
brr+1: int(*p)[4]
brr[0]: int *
brr[0]+1: int *
brr[0][0]: int
也就是说,我们可以将一个二维数组看成是一个一维数组,一行为一个单元格,遵循行优先的原则。
即brr[0][4]和arr[4]相比较,arr == brr[0],同为一维数组名。
在此,我们区别以下数组指针和指针数组的含义:
int (*p)[4];//数组指针:即指向数组的指针
int *p[4];//指针数组:即保存指针的数组
因此,利用调用函数时,我们可以将形参列表写成如下:
对了,在说一个关于二维数组越界的问题,由于我们可以将一个二维数组看成一个一维数组,当二维数组月结某一行时,自动跳转到下一行的起始位置。如下例所示,越界的位置和下一行的起始位置值一致。
最后附上判断复杂数据类型的方法:
(一):看符号的优先级
(二):[]数组 关注数组的格子数和数据类型
*指针 关注指针的指向内容
()函数 关注函数的参数列表和返回值