一、定义
int arr[10] 定义要类型 10为数组长度,位置是0~9
int brr[3][4] 定义要类型 表示3行4列 ,共12个位置
第一行为brr[0][k] k为列的取值 范围为0~3 其他行同理
第一列为brr[h][0] h为行的取值 范围是0~2 其他列同理
二、初始化
(1)一维数组
int arr[5] = {1,2,3,4,5};
int arr[5] = {1,2,3}; //剩余默认为0
arr[3] = 10 只是赋值,下标为3的arr数组的值为10
(2)二维数组是以行优先,所以在定义的时候可以省略行的值,但不能省略列的值。
int brr[2][3] ={{1,2,3},{4,5,6}};
//里面的一个大括号表示一行的值
int crr[2][3] ={1,2,3,4,5,6};
//按照行优先的规则,从第一行第一个的位置开始存放,当存满时候,就自动跳转到下一行开始存放
int drr[2][3] ={1,2,3};
//其余默认为0
int err[][3] = {{1,2,3},{4,5,6}};
int frr[2][3] ={1,2,3,4,5,6};
//省略行值,但系统会自动算出行值2
三、打印
利用函数调用,打印:
在利用函数调用打印二维数组时,一般我们的参数列表为
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];//指针数组:即保存指针的数组
附加:
关于二维数组越界的问题,由于我们可以将一个二维数组看成一个一维数组,当二维数组越界时,自动跳转到下一行的起始位置。两者位置是相同的。
#include <stdio.h>
int main()
{
int arr[2][3]={1,2,3,4,5,6};
printf("%d %d\n",&arr[0][3],&arr[1][0]);
return 0;
}