C语言中的多维数组



如果数组声明时只使用一个方括号指定大小,则称为一维数组。在一维数组中,每个元素都由其索引或下标标识。在C语言中,可以使用多个索引来模拟二维、三维或多维数组。

C语言中的多维数组

多维数组可以被称为嵌套数组。在这种情况下,外部数组中的每个元素本身都是一个数组。这种嵌套可以达到任意级别。如果外部数组中的每个元素都是另一个一维数组,则它构成一个二维数组。依次类推,如果内部数组是另一组一维数组的数组,则它是一个三维数组,等等。

多维数组的声明

根据嵌套级别,多维数组的声明如下:

type name[size1][size2]...[sizeN];

例如,以下声明创建一个三维整数数组:

int threedim[3][3][3];

多维数组可以有任意数量的维度。在本教程中,我们将学习两种常用的多维数组类型

  1. 二维数组
  2. 三维数组

C语言中的二维数组

二维数组是一维数组的数组。二维数组的每个元素本身都是一个数组。它就像一个表格或矩阵。元素可以被认为在逻辑上排列成行和列。因此,任何元素的位置都由其行号和列号来表征。行和列索引都从0开始。

two_dimensional_arrays

二维数组的声明和初始化

以下语句声明并初始化一个二维数组:

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 () {

   /* an array with 5 rows and 2 columns*/
   int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
   int i, j;
 
   /* output each array element's value */
   for ( i = 0; i < 5; i++ ) {
      for ( j = 0; j < 2; j++ ) {
         printf("a[%d][%d] = %d\n", 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("\n");
   }
   return 0;
}

输出

   1   2   3   4   5
  10  20  30  40  50
   5  10  15  20  25

C语言中的三维数组

三维数组是二维数组的数组,其中每个元素都是一个二维数组。3D数组需要三个下标来定义深度、行和列。

想象一下参加考试的学生坐在五个大厅里,每个大厅有二十排课桌,每排有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\n");

   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("\n");
      }
      printf("\n");
   }
   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\n", 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],则其乘积的大小为(只有当n等于p时乘法才可能)c[m][q]。

两个矩阵的乘积是矩阵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("\nMatrix 1 ...\n");
   for(i=0; i<3; i++){
      for(j=0; j<3; j++)
         printf("%d\t", mat1[i][j]);
      printf("\n");
   }

   printf("\nMatrix 2 ...\n");
   for(i=0; i<3; i++){
      for(j=0; j<3; j++)
         printf("%d\t", mat2[i][j]);
      printf("\n");
   }

   printf("\nMultiplication of the two given Matrices: \n");
   for(i=0; i<3; i++){
      for(j=0; j<3; j++)
      printf("%d\t", mat3[i][j]);
      printf("\n");
   }

   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
广告