3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
一把梭系列 ~ C語言範例 (0011) [二維(多維)陣列] 資料來源: https://openhome.cc/Gossip/CGossip/TwoDimArray.html ★前言: ★主題:     一維陣列使用陣列名稱與一個索引值來指定存取陣列元素,二維陣列使用陣列名稱與兩個索引值來指定存取陣列元素,宣告方式與一維陣列類似: int maze[5][10];     上面這個宣告會配置 5 * 10 = 50 個整數的記憶體空間給陣列來使用,二維陣列使用兩個索引值來指定存取陣列,這兩個索引值都是由 0 開始,下面這個程式簡單的示範二維陣列的存取: #include #define ROW 5 #define COLUMN 10 int main(void) { int maze[ROW][COLUMN]; for(int i = 0; i < ROW; i++) { for(int j = 0; j < COLUMN; j++) { maze[i][j] = (i + 1) * (j + 1); } } for(int i = 0; i < ROW; i++) { for(int j = 0; j < COLUMN; j++) { printf("%d\t", maze[i][j]); } putchar('\n'); } return 0; }     也可以在宣告二維陣列的同時指定二維陣列的值,例如: int maze[2][3] = { {1, 2, 3}, {4, 5, 6} };     從上面這個程式來看,可以清楚地看出 maze[2][3] 中 2 與 3 的意義,maze[2] 表示 maze 有兩個元素,各是 {1, 2, 3} 與 {4, 5, 6},也就是說,這兩個元素是一維陣列,而長度是 3。     若清楚二維陣列的記憶體配置方式,會理解到 {} 其實是可以不用的,例如: int maze[2][3] = { 1, 2, 3, 4, 5, 6 };     何謂二維陣列於記憶體中的配置方式?其實陣列存取時的行與列,是為了理解陣列元素的指定存取而想像出來的,索引值正確的意義,是指相對於陣列第一個元素 的位移量,例如在一維陣列中的陣列配置與索引意義如下圖所示:  maze[0][0]                       maze[1][0]  ─────────────────────────────────── │    1    │    2    │    3    │    4    │    5    │    6    │ ───────────────────────────────────     對 x32 的 int 整數陣列來說,每一位移量是 4 個位元組,而指定存取 maze[4],相當於指定存取相對於 maze[0] 四個位移量的記憶體空間。     即使是二維空間,其在記憶體中也是線性配置的     瞭解二維陣列在記憶體中的配置關係後,就可以知道,上圖可以看成是三個一維陣列在記憶體中連續配置,嚴格來說,C 沒有二維陣列這種東西,二維或多維陣列的概念,是以陣列的陣列(arrays of arrays)來實現。     可以使用底下的程式來驗證所謂的二維陣列,就是具有兩個一維陣列作為元素的陣列: #include #define ROWS 2 #define LEN 3 int main(void) { int maze[ROWS][LEN] = { {1, 2, 3}, {4, 5, 6} }; for(int i = 0; i < ROWS; i++) { int *row = maze[i]; for(int j = 0; j < LEN; j++) { printf("%d\t", row[j]); } printf("\n"); } }     就目前來說,可以知道的是 maze[i] 為每個一維 int 陣列的位址,型態是 int*,這是指標型態,之後會談到,也就是說 row 代表了每個一維 int 陣列,因而內層 for 迴圈可以使用索引來取得一維陣列內容。     更多維的陣列,就是依以上說明類推罷了,例如三維陣列: int arr[2][4][6]; ★code #include #include #define ROW 5 #define COLUMN 10 int main() { int i,j; int maze[ROW][COLUMN]; for(i = 0; i < ROW; i++) { for(j = 0; j < COLUMN; j++) { maze[i][j] = (i + 1) * (j + 1); } } for(i = 0; i < ROW; i++) { for(j = 0; j < COLUMN; j++) { printf("%d\t", maze[i][j]); } putchar('\n'); } int maze01[2][3] = { {1, 2, 3}, {4, 5, 6} };//使用二維陣列初始化方式初始二維陣列 for(i = 0; i < 2; i++) { int *row = maze01[i];//使用指標方式確認二維陣列資料在記憶體的擺放位址 for(j = 0; j < 3; j++) { printf("%d\t", row[j]); } } putchar('\n'); int maze02[2][3] = { 1, 2, 3, 4, 5, 6 };//使用一維陣列初始化方式初始二維陣列 for(i = 0; i < 2; i++) { for(j = 0; j < 3; j++) { printf("%d\t",maze02[i][j] ); } } return 0; } ★結果: ★延伸說明/重點回顧:     01.要了解二維或多維陣列在實際記憶體擺放方法,必須先了解基礎的計算機組織     02.二維陣列的存取已經有點指標的概念,在之後的篇章將會持續介紹     03.一般而言二維陣列就足夠大多數的應用,很少人會使用更高維度陣列,畢竟雙層迴圈的時間複雜度已經是n*m或n^2了

本文由jashliaoeuwordpress提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦