C 语言中的多维数组
用方括号声明一个大小值来表示数组,这种数组称为一维数组。在一维数组中,每个元素由其索引或下标标识。在 C 语言中,可以使用多个索引来模拟二维、三维或多维数组。
C 语言中的多维数组
多维数组可以称为嵌套数组。在这种情况下,外部数组中的每个元素本身就是一个数组。这种嵌套可以达到任意层级。如果外部数组中的每个元素都是另一个一维数组,则它们构成一个二维数组。反过来,内部数组是另一组一维数组的数组,它是一个三维数组,依此类推。
多维数组的声明
根据嵌套层级,多维数组的声明如下 -
type name[size1][size2]...[sizeN];
例如,以下声明创建一个三维整数数组 -
int threedim[3][3][3];
多维数组可以有任意数量的维度。在本教程中,我们将学习两种常用的多维数组类型:
- 二维数组
- 三维数组
C 语言中的二维数组
二维数组是一维数组中的一个数组。二维数组的每个元素本身就是一个数组。它类似于表格或矩阵。元素可以被视为按行和列进行逻辑排列。因此,任何元素的位置都由其行号和列号来表示。行和列的索引均从 0 开始。

二维数组的声明和初始化
以下语句声明并初始化一个二维数组 -
int arr[3][5] = {1,2,3,4,5, 10,20,30,40,50, 5,10,15,20,25};
arr 数组有三行五列。在 C 语言中,二维数组是行主序数组。第一个方括号始终表示行的维度大小,第二个方括号表示列数。显然,该数组有 3 x 5 = 15 个元素。该数组初始化为 15 个逗号分隔的值,这些值放在大括号内。
元素按行读取到数组中,这意味着前 5 个元素存储在第一行,依此类推。因此,数组声明中的第一个维度是可选的。
int arr[ ][5] = {1,2,3,4,5, 10,20,30,40,50, 5,10,15,20,25};
为了提高可读性,每行的元素可以选择放在花括号中,如下所示 -
int arr[ ][5] = { {1,2,3,4,5}, {10,20,30,40,50}, {5,10,15,20,25} };
这些数字按逻辑顺序以表格形式排列,如下所示 -
1 | 2 | 3 | 4 | 5 |
10 | 20 | 30 | 40 | 50 |
5 | 10 | 15 | 20 | 25 |
行索引为 1、列索引为 2 的单元格包含 30 个元素。
打印二维数组元素的示例
以下程序显示二维数组中每个元素的行索引和列索引 -
#include <stdio.h> int main () { /* 一个 5 行 2 列的数组 */ int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}}; int i, j; /* 输出每个数组元素的值 */ for ( i = 0; i < 5; i++ ) { for ( j = 0; j < 2; j++ ) { printf("a[%d][%d] = %d ", i,j, a[i][j] ); } } return 0; }
输出
a[0][0] = 0 a[0][1] = 0 a[1][0] = 1 a[1][1] = 2 a[2][0] = 2 a[2][1] = 4 a[3][0] = 3 a[3][1] = 6 a[4][0] = 4 a[4][1] = 8
对于二维或多维数组,编译器会分配一个内存块,其大小等于数组维度乘以数据类型的大小。在本例中,大小为 3 x 5 x 4 = 60 字节,其中 4 为 int 数据类型的大小。
即使所有元素都存储在连续的内存位置,我们也可以使用嵌套循环以行列格式打印元素。
将二维数组按行列矩阵打印的示例
以下程序按行列打印二维数组。
#include <stdio.h> int main() { int arr[3][5] = {1,2,3,4,5, 10,20,30,40,50, 5,10,15,20,25}; int i, j; for (i=0; i<3; i++){ for (j=0; j<5; j++){ printf("%4d", arr[i][j]); } printf(" "); } return 0; }
输出
1 2 3 4 5 10 20 30 40 50 5 10 15 20 25
C 语言中的三维数组
三维数组是由二维数组构成的数组,其中每个元素都是一个二维数组。三维数组需要三个下标来定义深度、行和列。
假设参加考试的学生坐在五个考场里,每个考场有 20 排桌子,每排有 5 张桌子。这种排列可以用一个三维数组表示,例如 -
Students[hall][row][column]
要定位每个学生,需要三个索引:考场号、该学生所在考场桌子的行号和列号。
三维数组示例
以下程序将数字存储在一个 3 x 3 x 3 的数组中 -
#include<stdio.h> int main(){ int i, j, k; int arr[3][3][3]= { { {11, 12, 13}, {14, 15, 16}, {17, 18, 19} }, { {21, 22, 23}, {24, 25, 26}, {27, 28, 29} }, { {31, 32, 33}, {34, 35, 36}, {37, 38, 39} }, }; printf("Printing 3D Array Elements "); for(i=0;i<3;i++) { for(j=0;j<3;j++){ for(k=0;k<3;k++){ printf("%4d",arr[i][j][k]); } printf(" "); } printf(" "); } return 0; }
输出
Printing 3D Array Elements 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39
多维数组元素的逐行求和
您可以通过使用索引访问元素来按行或按列计算所有元素的和。对于三维数组,您需要使用深度、行和列索引。对于二维数组,您需要使用行和列索引。这里我们使用二维数组。
示例:按行计算数值和
以下程序显示了二维数组每一行整数元素的和。
#include <stdio.h> int main() { int arr[3][5] = {{1,2,3,4,5}, {10,20,30,40,50}, {5,10,15,20,25}}; int i, j; int sum; for (i=0; i<3; i++){ sum=0; for (j=0; j<5; j++){ sum+=arr[i][j]; } printf("Sum of row %d: %d ", i, sum); } return 0; }
输出
Sum of row 0: 15 Sum of row 1: 150 Sum of row 2: 75
矩阵乘法
矩阵代数是数学的一个分支,其中矩阵是由按行和列排列的数字组成的二维数组。只有当第一个矩阵的列数等于第二个矩阵的行数时,两个矩阵才能相乘。两个兼容矩阵的乘积等于第一个矩阵的行与第二个矩阵的列之间的点积。
如果两个矩阵的大小分别为 a[m][n] 和 b[p][q],则它们相乘的结果是一个大小为 c[m][q] 的矩阵(只有当 n 等于 p 时才可以进行乘法)。
两个矩阵的乘积是矩阵 A 中某一行与矩阵 B 中某一列对应元素的乘积之和。
二维数组(矩阵)乘法示例
以下程序执行两个矩阵的乘法。
#include<stdio.h> int main(){ int mat1[3][3] = { {2, 4, 1} , {2, 3, 9} , {3, 1, 8} }; int mat2[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 4, 7} }; int mat3[3][3], sum=0, i, j, k; for(i=0; i<3; i++){ for(j=0; j<3; j++){ sum=0; for(k=0; k<3; k++) sum = sum + mat1[i][k] * mat2[k][j]; mat3[i][j] = sum; } } printf(" Matrix 1 ... "); for(i=0; i<3; i++){ for(j=0; j<3; j++) printf("%d ", mat1[i][j]); printf(" "); } printf(" Matrix 2 ... "); for(i=0; i<3; i++){ for(j=0; j<3; j++) printf("%d ", mat2[i][j]); printf(" "); } printf(" Multiplication of the two given Matrices: "); for(i=0; i<3; i++){ for(j=0; j<3; j++) printf("%d ", mat3[i][j]); printf(" "); } return 0; }
输出
Matrix 1 ... 2 4 1 2 3 9 3 1 8 Matrix 2 ... 1 2 3 3 6 1 2 4 7 Multiplication of the two given Matrices: 16 32 17 29 58 72 22 44 66