二维数组定义的一般格式如下:
类型说明符数组名[常量表达式1][常量表达式2];其中:
(1)类型说明符、数组名等和一维数组中的规定相同。
(2)常量表达式1表示二维数组第一维的长度,通常称为数组的行数。
(3)常量表达式2表示二维数组第二维的长度,通常称为数组的列数。
(4)行号和列号也是从0开始编号,分别为二维数组的行下标和列下标。
例如:
int a[3]4];
定义了一个3行4列的整型数组,数组名为a,其数组元素的类型为整型。该数组的元素共有3×4个,其逻辑结构如图6-8所示。
图6-8 二维数组逻辑结构
如前所述,C语言中可以将二维数组看作是多个一维数组的集合,如int a[3][4]可以把a看作是一个长度为3的一维数组,其三个单元分别是a[0]、a[1]和a[2],而每一个数组单元中又存放了一个长度为4的整型的一维数组,如图6-9所示。
图6-9 包含一维数组的一维数组
可以把a[0]、a[1]和a[2]分别看成是三个一维数组的名字,这相当于一次定义了三个一维数组,而且比定义多个一维数组在使用和管理上都要方便。使用其中的某一个单元时,完全可以按照一维数组单元的引用方法。如要使用a[2][3],首先使用的是一维数组a的2号单元,其引用形式为a[2]。a[2]中存放的又是一个一维数组,将a[2]看成该数组的名字,使用其3号单元,则引用形式为a[2][3]。而这也正是下面要讲述的二维数组单元的引用形式。
2.二维数组单元的引用
二维数组单元的引用的形式为:
数组名[下标1][下标2];
引用二维数组单元时需要注意下标的范围,二维数组下标仍从0开始,因此行和列的最大下标均为其长度减1。如int a[3][4]中,其行下标范围为0~2,列下标范围为:0~3,超出了这一范围,将引起越界错误。(www.xing528.com)
由于二维数组中包含行和列,因此用双重循环处理二维数组的每一个单元是最自然的选择,在特殊处理中,可能需要更多重的循环。
【例6-8】定义一个3×4的二维数组,给每一个单元输入值并输出此数组。
二维数组的使用中请注意以下几点:
(1)同一维数组一样,二维数组仍要求按单元逐个引用,其每一个单元仍相当于一个普通变量,使用方法同普通变量相同。例如输入是用scanf(“%d”,&a[i][j]),这里仍用单元的地址。可以将a[i][j]看成是i行j列的单元的名字,同普通变量名字相比,其单元受两个下标约束,仅此而已。
(2)程序中用变量i表示数组的行,用变量j表示数组的列,当i和j在循环中不断自加时,可以代表数组的每一个单元。处理二维数组时可以按照行的顺序来处理,也可以按照列的顺序处理,如将例6-8中的输入语句改成scanf(“%d”,&a[j][i]),则会将1、2、3存入数组第0列,4、5、6存入第1列,以此类推。
(3)输入数据不要求按行列排列,程序会按照循环的过程自动将输入的数据存入每一个单元。
(4)注意输出时换行的使用,在输出完一行后要输出一个换行,否则所有的数据仍输出到同一行中。
3.二维数组的存储结构
逻辑上可以将二维数组理解成是包含行和列的二维的表格,但实际上内存却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维的数组呢?通常有两种存储方式:一种是按行存储,即放完一行之后顺次存放其下一行;另一种是按列存储,即放完一列之后再顺次存放其下一列。在C语言中,二维数组是按行存储的,称为“行”主序存储,如定义int a[3][4],其存储结构如图6-10。
图6-10 二维数组的存储结构
即
先将a看成是长度为3的一维数组,为其分配三个存储单元a[0]、a[1]和a[2],然后依次存放每一个单元。由于a[i]中是一个长度为4的一维数组,因此相当于先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行是一个一维数组,其中的4个元素也是依次存放。由于数组a的基类型为int类型,该类型在Visual C++6.0环境中占4个字节的内存空间,所以每个元素均占有4个字节,其地址从2000开始依次加4,但对于a[0]、a[1]和a[2]单元,其地址依次加16,因为它们的一个单元中存放了4个整数。
对于更高维数的数组,可以类比二维数组的定义和引用形式,不再一一讨论。如三维数组定义格式为:
类型说明符数组名[常量表达式1][常量表达式2][常量表达式3];
其引用格式为:
数组名[下标1][下标2][下标3];
三维数组中每一个数组单元受三个下标的约束,可以将三维数组看成是二维数组的集合,更高维数的数组仍以此类推。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。