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