详解二维数组

二维数组的使用规则

一:定义
   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];//指针数组:即保存指针的数组

因此,利用调用函数时,我们可以将形参列表写成如下:

对了,在说一个关于二维数组越界的问题,由于我们可以将一个二维数组看成一个一维数组,当二维数组月结某一行时,自动跳转到下一行的起始位置。如下例所示,越界的位置和下一行的起始位置值一致。


最后附上判断复杂数据类型的方法:
(一):看符号的优先级
(二):[]数组       关注数组的格子数和数据类型
              *指针      关注指针的指向内容
      ()函数     关注函数的参数列表和返回值

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页