23-二维数组的定义和初始化

 

      所谓多维数组就是二维和大于二维的数组,在C语言中并不直接支持多维数组,包括二维数组。

      多维数组的声明是使用一维数组的嵌套声明实现的。一个一维数组的每个元素又被声明为一维数组,从而构成二维数组,可以说二维数组是特殊的一维数组。

1、二维数组的定义

二维数组定义的一般形式是:

  类型说明符  数组名[常量表达式1][常量表达式2]

其中,常量表达式1表示第一维下标的长度;常量表达式2表示第二维下标的长度。

例如:int a[3][3];

说明了一个3行3列的数组,数组名为a,其下标变量的类型是整型。该数组的下标变量共有3 * 4 = 12个,即:

 

2、二维数组的访问

二维数组的元素也称为双下标变量,其表示形式为:

  数组名[第一维下标][第二维下标]

其下标应为整型常量或整型表达式。

例如:a[2][4]   表示a数组2行4列的元素。

 

  下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。

  数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;

  而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量、变量和表达式。

3、二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值。

二维数组可 1) 按行分段赋值  2)也可按行连续赋值。

例如对数组 a[2][3]

按行分段赋值可写为:

  int a[2][3] = {{1, 2, 3}, {4, 5, 6}};

按行连续赋值可写为:

  int a[2][3] = {1, 2, 3, 4, 5, 6};

这两种赋初值的结果是完全相同的。

对于二维数组初始化赋值还有以下说明:

(1) 可以只对部分元素赋初值,为赋初值的元素自动取0。例如:

  int a[2][2] = {{1}, {2}};

是对每一行的第一列元素赋值,未赋值的元素取0值。赋值后各元素的值为:

 1  0

 2  0

(2) 如对全部元素赋初值。则第一维的长度可以不写

int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int a[][3] =  {{1, 2}, {3, 4, 5}, {6}, {7, 8, 9}};

(3) 指定特定元素的初始化

char chars1[3][3] = {[0][2] = 4};

char chars2[3][3] = {[1] = {3, 5, 7}};

(4) 数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组可以分解为多个一位数组。

例如:二维数组a[2][2], 可分解为2个一维数组,其数组名分别为:

a[0]

a[1]

  对这2个一维数组不需另作说明即可使用。这2个一维数组都有2个元素,例如:一维数组a[0]的元素为a[0][0]、a[0][1]。

必须强调的是:这里的a[0]  a[1]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。

3、二维数组的存储

  二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。

  但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。

  如何在一维存储器中存放二维数组,可两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。 

  在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。

 

 

 

 

posted @ 2014-10-02 08:33  微雨独行  阅读(820)  评论(0编辑  收藏  举报
1 2