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
電資鼠 - 您的學習好夥伴
23會員
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
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
高中數學主題練習—二階行列式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News