C语言二维数组的定义、赋值和初始化
二维数组是相对一维数组来说的,所谓二维数组,就是带有行和列的数组,就像表格一样。
	 
二维数据是按照行存储的,每个整型元素占 4 个字节(数组 a 是 int 类型)。先依次保存第 1 行所有元素,再依次保存第 2 行所有元素……直到所有行元素全部保存。
	 
已知 a[0][0] 在内存中的地址,a[1][2] 的地址是多少呢?计算方法如下。
注意,如果定义了数组 a[3][4],则元素下标的变化范围,行号范围是 0~2,列号范围是 0~3。
还可以这样:
分析下面的二维数组初始化后的值:
	 
原因是 4*i+j,i 表示行号,j 表示列号,首先赋值 i=0 的行的数组元素值 {0,1,2,3},内层循环结束,接下来外层循环变量 i=1,继续对数组元素第 2 行赋值 {4,5,6,7},这样反复进行,就会得到所有元素的值。
计算二维数组对角元素的和时,对角线元素的特点是行号和列号相同,所以无须使用双重循环遍历数组,使用单循环就足够了,运算时取数组的行号和列号相等即可。
实现行列互换的代码如下:
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
	C语言二维数组的定义
C语言二维数组定义的一般形式为:类型说明符数组名[常量表达式][常量表达式];
例如:
	int a[3][4];   /*定义a为3行4列的数组*/
	int b[5][10];  /*定义b为5行10列的数组*/
	int a[3,4];  /*错误的数组定义*/
	int b[5,10];  /*错误的数组定义*/

二维数据是按照行存储的,每个整型元素占 4 个字节(数组 a 是 int 类型)。先依次保存第 1 行所有元素,再依次保存第 2 行所有元素……直到所有行元素全部保存。

已知 a[0][0] 在内存中的地址,a[1][2] 的地址是多少呢?计算方法如下。
- a[1][2] 的地址 =a[0][0] 地址 +24 字节
- 24 字节 =(1行×4列+2列)×4 字节
注意,如果定义了数组 a[3][4],则元素下标的变化范围,行号范围是 0~2,列号范围是 0~3。
C语言二维数组的初始化
同一维数组一样,二维数组的初始化也可以有以下两种形式。1)先定义再初始化
	int a[3][4];
	a[0][0]=1;
	a[2][3] = 9;
2)定义的同时初始化
int a[3][4]= { {1,2,3,4},{5,6,7,8},{9,0,1,2}};
或者:int a[3][4]= { 1,2,3,4,5,6,7,8,9,0,1,2};
二维数组在内存中是按照线性顺序存储的,所以行括号可以省去。还可以这样:
int a[ ][4]= { {1,2,3,4},{5,6,7,8},{9,0,1,2}};
或者:int a[ ][4]= { 1,2,3,4,5,6,7,8,9,0,1,2};
省去行数 3 也是可以的,但是列数 4 不能省去。编译器会根据所赋数值的个数及数组的列数,自动计算出数组的行数。分析下面的二维数组初始化后的值:
int a[3][4]={{1},{5},{9}};
可以认为二维数组是由 3 个一维数组构成的,每个一维数组有 4 元素,这就可以和一维数组初始化对应上。经过上述初始化,数组 a 元素值的形式如下表所示。
C语言二维数组元素的引用
二维数组元素的操作和一维数组元素的操作相似,一般使用双重循环遍历数组的元素,外层循环控制数组的行标,内层循环控制数组的列标,如下所示:
int i,j;
int array[3][4];
for(i=0;i<3;i++)
{
    for(j=0;j<4;j++)
    {
       array[i][j]=4*i+j;
    }
}
经过上面双循环的初始化操作,数组 array 元素的值是 {0,1,2,3,4,5,6,7,8,9,10,1 1}。原因是 4*i+j,i 表示行号,j 表示列号,首先赋值 i=0 的行的数组元素值 {0,1,2,3},内层循环结束,接下来外层循环变量 i=1,继续对数组元素第 2 行赋值 {4,5,6,7},这样反复进行,就会得到所有元素的值。
C语言二维数组的应用举例
下面通过两个实际应用的例子,介绍C语言二维数组的使用方法和技巧。示例1
求一个 3×3 矩阵从左上到右下的对角线元素之和。请看下面代码:
#include <stdio.h>
int main()
{
  float a[3][3],sum=0;
  int i,j;
  printf("请输入3*3个元素:\n");
  for(i=0;i<3;i++)       /*循环输入9个元素*/
  {
     for(j=0;j<3;j++)
        scanf("%f",&a[i][j]);
  }
  for(i=0;i<3;i++)    /*计算对角元素和*/
     sum=sum+a[i][i];
  printf("左上到右下一条对角线元素和为 %6.2f\n",sum);
  return 0;
}
运行结果:
	请输入3*3个元素:
	9 8 7
	3 5 4
	1 2 3
	左上到右下一条对角线元素和为  17.00
计算二维数组对角元素的和时,对角线元素的特点是行号和列号相同,所以无须使用双重循环遍历数组,使用单循环就足够了,运算时取数组的行号和列号相等即可。
示例2
将一个二维数组的行和列元素互换,存到另一个二维数组中,实现数组的转置。请看下面代码:
#include <stdio.h>
int main(void)
{
  int a[2][3]={{1,2,3},{4,5,6}};   /*数组a*/
  int b[3][2],i,j;
  printf("array a:\n");
  for (i=0;i<=1;i++)
  {
    for (j=0;j<=2;j++)
    {                 
      printf("%5d",a[i][j]);   /*输出数组a*/
      b[j][i]=a[i][j];        /*行列互换存储到数组b中*/
    }
    printf("\n");
  }
  printf("array b:\n");
  for(i=0;i<=2;i++)       /*输出数组b*/
  {
    for(j=0;j<=1;j++)
      printf("%5d",b[i][j]);
    printf("\n");
  }
  return 0;
} 
运行结果:
	array a:
	    1    2    3
	    4    5    6
	array b:
	    1    4
	    2    5
	    3    6
实现行列互换的代码如下:
b[j][i]=a[i][j];
巧妙地使用行号和列号的交换就可以实现转置。声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
 
	