C語言自學攻略-二維陣列與指標

更新 發佈閱讀 4 分鐘

前一章節講了許多,接下來要進入多維陣列了,不過相信你很快就能適應了。

簡單來說,int (*p)[MaxN] 是「指向一個含有 MaxNint 的陣列」的指標。

假設有一個二維陣列:

int arr[MaxM][MaxN];
  • arr 本身在某些表達上會轉換成 int (*)[MaxN],也就是指向 arr[0] (第一列)的指標。

現在若我們有:

int (*p)[MaxN];
p = arr; // p現在指向arr[0],也就是arr的第一列
  • p 的型別:int (*p)[MaxN]
    • 這表示 p 是一個指標,指向「包含 MaxNint的陣列」。
    • 當我們解參考 p 時,得到的是「int [MaxN]」型態的陣列,所以現在*p類似於一維陣列的名稱功能
  • p 是什麼?
    • p 目前可被視為 p 所指向的第一整列(row)。也就是 arr[0] 這個一維陣列(大小為 MaxN)。
    • p 解參考一次的話,上面說到*p類似於一維陣列的名稱功能。所以現在*p表示指向arr[0]這一陣列的第一個元素的位址。可以說是指到arr[0][0]這個位址。
  • (*p)[i]
    • (*p)[i] 表示從 p (也就是 arr[0]) 開始,取第 i 個元素。
    • 所以 (*p)[i] 等同於 arr[0][i] (為一個 int)。
  • 如果將 p 進行指標運算,如 p + 1
    • p + 1跳到下一列,也就是 arr[1]
    • 所以 (p + 1) 是 int (*)[MaxN] 型別的值,指向 arr[1]
    • (*(p + 1))[i] = arr[1][i]
  • **p :
    • 代表arr[0][0] 的內容
    • **(p+1) 代表arr[1][0] 的內容
    • *(*p+2)+1) 代表arr[2][1] 的內容

從上面我們還可以總結出,二維陣列名稱和名稱解參考一次都會輸出位址、而解參考兩次會輸出內容。

你可以這樣記: 要得到內容的話,幾維就解參考幾次

範例:

#include <stdio.h>

int main() {
const int MaxM = 3;
const int MaxN = 4;
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};

// p 是一個指標,指向一個擁有MaxN個int的陣列,即 p的型態為 int (*p)[MaxN]
int (*p)[MaxN] = arr; // 指向arr[0]這一行

// 現在 p 等同於 arr[0] (第一列)
// (*p)[0] = arr[0][0] = 1
// (*p)[1] = arr[0][1] = 2

printf("(*p)[0] = %d\n", (*p)[0]); // 輸出 1
printf("(*p)[1] = %d\n", (*p)[1]); // 輸出 2

// 將p往後移動一列
p = p + 1;
// 現在p指向arr[1]
// (*p)[0] = arr[1][0] = 5
// (*p)[1] = arr[1][1] = 6

printf("(*p)[0] = %d\n", (*p)[0]); // 輸出 5
printf("(*p)[1] = %d\n", (*p)[1]); // 輸出 6

// 我們也可以用迴圈走訪整個2維陣列
// 將p重新指回arr
p = arr;
for (int i = 0; i < MaxM; i++) {
for (int j = 0; j < MaxN; j++) {
// p+i 指向 arr[i], (* (p+i))[j] = arr[i][j]
printf("%d ", (*(p+i))[j]);
//printf("%d ", *(*(p+i)+j)); 相同效果
//printf("%d ", *(*(arr+i)+j)); 相同效果
//printf("%p ", *(p+i)+j); 相當於arr[i][j]的位址
}
printf("\n");
}

return 0;
}
  • 從上面的程式碼中,我們知道了各種方法去使用指標方式存取陣列。
留言
avatar-img
電資鼠 - 您的學習好夥伴
19會員
242內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
2025/03/07
本章節將探討左下三角稀疏矩陣。
Thumbnail
2025/03/07
本章節將探討左下三角稀疏矩陣。
Thumbnail
2025/03/07
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
Thumbnail
2025/03/07
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
Thumbnail
2025/03/07
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。
Thumbnail
2025/03/07
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
高中數學主題練習—C計算(一)
Thumbnail
高中數學主題練習—C計算(一)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News