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
留言分享你的想法!
avatar-img
電資鼠 - 您的學習好夥伴
9會員
215內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 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
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
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