相同类型的变量可以组成数组,当程序中需要若干类型的一维数组时,可以把他们再合并成一个数组------二维数组
1.二维数组的定义
类型名 数组名[常量表达式][常量表达式]
例如:int a[3][4]其中int [3][4]表示二维数组类型,a代表数组名
3表示a中有三个元素,a[0],a[1],a[2] ,相当于定义了三个一维数组,每个一维组中含有四个下标变量,a[0],a[1],a[2]都是一维数组的名字
相当于二维数组中有12个下表变量,逻辑上想象成三行四列,呈现二维表格
注意:
1.二维数组中两个【】中只能出现整型常量而不能出现变量
2.【】【】中代表的分别是二维数组的元素个数和一维数组的元素个数,就是表格的行数和列数
3.数组元素的行列下标都是从零开始的
2.二维数组的元素构成和储存结构
1.二维数组的元素是一维数组
2.二维数组在内存中也是占据一段连续的储存空间,以int a[3][4]为例子,先是a[0]的四个元素,然后是a[1]的四个元素,然后是a[2]的四个元素
3.二维数组名的指针类型
二维数组名a也为退化为指向二维数组第一个元素,也就是第一个一维数组的指针,就是指向a[0]
a+1指向a[1]
a+2指向a[2]
而一维数组a[0]表示指向a[0]内部第一个下表变量的指针,指向a[0][0]
a[0]指向a[0][0]
a[0]+1指向a[0][1]
如果要打印指针的地址的话,会发现a和a+1地址相差16,而a[0]和a[0]+1地址相差4
所以说指针不仅仅是一个地址,它还包含了类型信息
4.二维数组下表变量的表示方法
1.下标法
如果有二维数组int a[3][4],那么a[2][1]可以表示下表变量
2.指针法
在一维数组的下表变量引用中我们学过
a[1]等价于*(a+1)
故a[2][1]可以表示成*(*(a+2)+1)
1.a是指向一维数组a[0]的,所以a+i指向a[i],那么*(a+i)就是a[i]
2.a[i]是一维数组名,指向一维数组中第一个下表变量a[i][0]
3.因为a[i]指向a[i][0],所以a[i]+j指向a[i][j],所以说a[i][j等价于*(a[i]+j)
4.由1可知,a[i]可以用*(a+i)表示,所以a[i][j]等价于*(*(a+i)+j)
3.混合法
5.二位数组的引用
1.引用下标变量
可以用第四节的下表变量的三种表示方法
2.每次只允许操作一个下表变量,若要操作多个下表变量,可以用循环
3.使用数组元素时,下标不能越界
6.二维数组的初始化
1.对所有的下表变量赋初值
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}
2.可以对每行加上花括号
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
3.一维数组的个数可以省略,然后电脑自动获取元素个数或者花括号个数来确认一维数组个数
int a[][3]={1,2,3,4},相当于int a[2][3],因为有四个变量,至少得2个4个下表变量大小的一维数组
int a[][3]={{1,2},{3},{4}},相当于 int a[3][3],因为有三个花括号
4.可以只对部分下表变量赋初值
int a[2][3]={1,2,3},那么下表变量的值分别是1,2,3,4,5,6
int a[][3]={{1,2},{1}},那么下表变量的值分别为1,2,0,1,0,0