二维数组
一、定义
- ①数组两个中括号[][],第一个可有可无,第二个必须有,里面的内容为常量表达式,也就是不能改变的。
当数组中每个元素带有两个下标时,称这样的数组为二维数组。 - 在C语言中,二维数组的定义语句形式如下所示:(可以同时定义多个类型名相同的变量)
类型名 数组名[常量表达式1][常量表达式2];——为数组说明符
- 二维数组说明符中
必须
有用两个分开的方括号[][]括起来的常量表达式(绝对不能把两个内容放在一个[]括号中),常量表达式的值只能是正整数。
常量表达式1为行数,常量表达式2为列数。
例如有以下定义:
int a[3][4];
其中,int是类型名,a[3][4]为二维数组说明符。
3行4列的二维数组如下所示:
第0列 第1列 第2列 第3列
第0行 a[0][0] a[0][1] a[0][2] a[0][3]
第1行 a[1][0] a[1][1] a[1][2] a[1][2]
第2行 a[2][0] a [2][1] a[2][2] a[2][3]
- 每个元素有两个下标,第一个方括号中的下标代表行号,称行下标;第二个方括号中的下标代表列号,称列下标。每个下标从0开始,到数组长度减1结束。一般定义数组时,如果使用for循环,其中的判断的条件可以是数组不等于’\0’,或者知道数组长度,小于该长度,如i<5。其中5为一维数组的上界,二维数组的行上界或列上界。
- 数组中的元素在内存中占一系列连续的存储单元。也就是说,先存放第0行的元素,再存放第1行的元素···这种存放顺序称为“
按行存放
”。按照顺序走,第0行没有存放完,不能存放下一行。
二、二维数组元素的引用
*引用二维数组元素时必须带有两个下标。引用形式如下:
数组名[下标表达式1][下标表达式2]
例如,若有以下定义语句:
double w[4」[2];
- 则w[0][1],w[i][j].w[i+k][j+k]都是合法的数组元素引用形式,只是每个下标表达式的值必须是整数,且不得超越数组定义中的上、下界。下界为从0开始。
- 注意:引用二维数组元素时,一定要把两个下标分别放在两个方括号内,例如,引用以上w数组元素时,不可以写成:w[0,1]、w[i,j]、w[i+k,j+k],这都是不合法的。两个下标要分开,不要串门,而且是常量表达式。
二、二维数组的初始化
不同的初始化,主要看花括号的个数与数组元素的区别,主要有四种初始化的选择。
- 1、所赋初值个数与数组元素的个数相同
全部初值括在一对花号中,每一行的初值又分别括在一对花括号中,之间用逗号隔开:
int a[4][3]= { { 1,2,3 } , { 4,5,6 } , { 7,8,9 } , { 10,11,12 } } ; - 2、每行所赋初值个数与数组元素的个数不同
当某行一对花括号内的初值个数少于该行中元素的个数时,如:
int a[4][3]={ { 1,2 },{ 4,5 }, { 7 },{ 10 };
系统将自动给该行后面的元素补初值0。不要越界,一个花括号只负责一行的内容,不负责其他行的内容,不能改变其他花括号中的内容。 - 3、所赋初值行数少于数组行数
当代表着给每行赋初值的行花括号对少于数组的行数时,如:
int a[4][3]= { { 11,21 } , { 14,5 } } ;
系统将自动给后面各行的元素补初值0。 - 4、赋初值时省略行花括号对
在给二维数组赋初值时可以不用行花括号对,例如:
int a[4][3] ={ 1,2,4,5 };
注意:此处所赋初值与上面第3种情况中所赋初值的结果完全不同。在编译时,系统将按a
数组元素在内存中排列的顺序,将花括号内的数据一-对应地赋给各个元素,若数据不足,系统将给后面的元素自动补初值0。按照数组存放的顺序走,要循规蹈矩。
四、通过赋初值定义二维数组的大小
对于一维数组,定义中省略方括号中的常量表达式,通过所赋初值的个数来确定数组的大小;
对于二维数组,只能省略第一个方括号中,而不能省略第二个方括号中的常量表达式。所以是第一个方括号的内容可有可无,第二个必须有。两个方括号不能漏了。
例如: int a[ ][3] ={{1,2,3},{4,5},{6,8}};
第一维的大小按以下规则决定:
- (1)当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小。
- (2)当初值的个数不能除尽时,则:第一维的大小=所得的商数+1
五、二维数组的定义和数组元素引用举例
例1: 通过键盘给2x3的二维数组输入数据,第一行赋1、2、3,第二行赋10、20、30,然后
按行输出此二维数组。
本题示例了引用二维数组元素、对二维数组进行输入和输出的基本方法。程序中用i作为
行下标,j作为列下标。程序如下:
#include<stdio.h>
int main(){
int s[2][3],i,j;
printf("请输入需要赋值的数\n");
for( i=0 ; i<2 ; i++)
for(j=0; j<3 ; j++)
scanf("%d" ,&s[i][j]);
printf("输出二维数组\n");
for( i=0 ; i<2 ; i++)
{
for(j=0; j<3; j++)
printf("%4d" ,s[i][j]);
printf("\n");
}
}