C/C++之二维数组

150 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

二维数组的定义

1.二维数组的一般定义形式

类型标识符   数组名  [行常量表达式] [列常量表达式];

例如:

int a[3][4],b[3][5];

定义了两个二维数组,数组a有3行4列共12个元素,而数组b有3行5列共15个元素。 2.二维数组说明 (1)二维数组的逻辑形式虽然由行、列组成,例如数组a[3][4]的逻辑形式如图8-6所示, 在这里插入图片描述

但实际上,二维数组元素在内存中也是顺序存放的,排列顺序是“按行存放”,即先顺序存放第一行的元素,再存放第二行,以此类推,如图8-7所示。 在这里插入图片描述 (2)通过图8-7可知,设有一个mn的数组s,则第i行第j列的元素s[i][j]在数组中的位置为:in+j。(注意:行号、列号均从0开始计数)

二维数组元素的引用

1.二维数组元素的引用形式为:

数组名  [行下标表达式][列下标表达式]

例如:

a[2][0]

应用的是数组的第2行第0列的元素。 2.说明 (1)“行下标表达式”和“列下标表达式”都应是整形表达式或符号常量。 例如:a[2-1][3-2]、a[1]['b'-'a']等都是合法的二维元素引用。 (2)“行下标表达式”和“列下标表达式”的值都应在合法的范围内。 (3)对于二维数组元素的引用,不能写成a[2,1]或a(2,1)的形式。 (4)对于二维数组元素的输入输出操作可以使用双重循环完成,一般用外层循环的循环变量充当行下标,用内层循环的循环变量充当列下标。

例如:定义一个3×3二维数组,输入数组元素的值,并以3×3矩阵的形式输出数据。 程序如下:

#include <stdio.h>
main()
{
int a[3][3];
int i,j;
for(i=0;i<3;i++)  /*为数组输入数据*/
	for(j=0;j<3;j++)
	scanf("%d",&a[i][j]);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
	printf("%4d",a[i][j]);
	printf("\n");  /*每输出一行换行*/
}
}

程序执行,输入数据:

1 2 3 4 5 6 7 8 9

输出结果:

1 2 3
4 5 6
7 8 9

二维数组元素的初始化

同一维数组一样,也可以在定义二维数组时对二维数组进行初始化。对二维数组初始化有以下几种形式: (1)分行对二维数组元素赋初值 初始化形式为:

类型标识符  数组名[行常量表达式][列常量表达式]={{第0行初值表},{第1行初值表},···,{最后1行初值表}};

例如:

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

(2)按二维数组在内存中的排列顺序给各元素赋初值 初始化形式为:

类型标识符 数组名[行常量表达式][列常量表达式]={初值表};

例如:

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

(3)对每行的部分元素赋初值 初始化形式与第一种相似,但可以不给全部元素赋初值。例如:

int a[3][4]={{1},{0,3},{8}};

初始化后数组中各元素的值为: 第一行:1 0 0 0 第二行:0 3 0 0 第三行:8 0 0 0 这种形式对非0元素较少时,比较方便,不必将所有的零都写出,只需说明非必要的数据即可。 (4)如果对全部元素都赋初值,则定义时,“行常量表达式”可以省略。但“列常量表达式”不能省略。系统会根据给出的初值总数和列数计算出行数。 所以上面三种元素初始化形式,可以以下述形式出现:

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

二维数组实例

image.png

程序如下:

#include <stdio.h>
void main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int b[3][3];
int i,j;
for(i=0;i<3;i++)
	for(j=0;j<3;j++)
		b[i][j]=a[j][i];
for(i=0;i<3;i++){
	for(j=0;j<3;j++)
	 	printf("%3d",b[i][j]);
	 	printf("\n");	
    }
}