前一篇,我们介绍了一维数组的一般定义格式为:
类型 数组名[ 元素个数 ];
一维数组使用一个下标确定个元素在数组中的顺序,可用排列成一行的元素来表示。如果要定义一个二维数组,只要增加一维下标即可,二维数组的一般定义格式为:
类型 数组名[ 第一维长度 ][ 第二维长度 ];
二维数组用两个下标确定个元素在数组中的顺序,可用排列成i行j列的元素表示。第一维的长度代表数组每一列的元素个数,第二维的长度代表数组每一行的元素个数。
例如:short matrix[3][4];
声明的是一个具有3行4列共12个短整形元素的二维数组。
第一维(行)的下标值从0变化到2,第二维(列)的下标值从0变化到3,因此,第一个元素的下标matrix[0][0],最后一个元素为matrix[2][3]。
一维数组在内存中占用的字节数为:数组长度×sizeof(基类型),
二维数组占用的字节数为:第一维长度×第二维长度×sizeof(基类型)。
由于短整型占2个字节,数组matrix有12个短整型元素,因此在内容中占24个字
节的连续存储空间。注意,在不同的编译系统中,int型所占的字节数是不同的。
因此,用sizeof运算符来计算一个类型或者变量在内存中所占的字节数更“靠
谱”,并且也有利于提高程序的可移植性(Portability)。
n维数组用n个下标来确定个元素在数组中的顺序。
由于C语言中不带下标的数组名具有特殊的含义,他代表数组的首地址,因此不能整体引用一个数组,每次只能引用指定下标值得数组元素。
对于二维数组,既可以按元素初始化,也可以按行初始化。
下面两句是等价的:
short matrix[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
short matrix[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
当初始化列表给出数组全部元素的初始值时,第一维的长度声明可以省略,此时,系统将按初始化列表中提供的初值个数来定义数组的大小。
下面两句时等价的:
short matrix[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
short matrix[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
按行初始化时,即使初始化列表中提供的初值个数可以少于数组元素的个数,第一维的长度声明也可以省略,此时系统自动给后面的元素初始化为0.
下面两句是等价的:
short matrix[ ][4]={{1,2,3},{4,5},{6}};
short matrix[3][4]={{1,2,3,0},{4,5,0,0},{6,0,0,0}};
注意,数组第二维的长度声明永远不能省略。这是因为C语言中的二维数组元素在c编译程序为其分配的连续
存储空间中是按行存放的,即存在完整第一行后存第二行,然后再第三行,以此类推。存放时系统必须知道
每一行有多少个元素才能正确计算出该元素相对于二维数组第一个元素的偏移量,这样就必须已知数组第二
维的长度。
例题:从键盘输入某年某月(包括闰年),编程输出该年的该月拥有多少天。
#include <stdio.h>
#define Mouths 12
int days[2][Mouths]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
int main(void)
{
int year,mouth;
do
{
printf("Input year, mouth:");
scanf("%d,%d",&year,&mouth);
}while(mouth<1||mouth>12);
if(((year%4==0)&&(year%100!=0))||(year%400==0))
printf("The number of days is %d\n",days[1][mouth-1]);
else printf("The number of days is %d\n",days[0][mouth-1]);
return 0;
}