指針與多維度數組在 C 語言中

你好啊,未來的編程超新星!? 我很高興能成為你探索指針和多維度數組世界的導師。作為一個教了多年編程的人,我可以向你保證,雖然這些概念起初可能看起來有點複雜,但一旦你掌握了要領,它們其實非常迷人。那麼,我們來開始吧!

C - Pointers vs. Multi-dimensional Arrays

指針與一維數組

在我們深入多維度數組之前,讓我們從基礎開始:指針和一維數組。這兩個概念在 C 語言中密切相關,理解它們之間的關係至關重要。

什麼是指針?

指針是一個存儲另一個變量記憶地址的變量。把它想象成一個指向你計算機記憶中數據存儲位置的指示牌。以下是如何聲明和使用指針的方式:

int number = 42;
int *ptr = &number;

printf("Value of number: %d\n", number);
printf("Address of number: %p\n", (void*)&number);
printf("Value of ptr: %p\n", (void*)ptr);
printf("Value ptr is pointing to: %d\n", *ptr);

在這個例子中,ptr 是一個指針,它持有 number 的地址。& 運算符給我們變量的地址,而 * 運算符(當與指針一起使用時)給我們該地址的值。

數組與指針

現在,這裡有點意思了。在 C 語言中,數組的名稱實際上是指向其第一個元素的指針!讓我們看看這是怎麼工作的:

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;  // 不需要使用 &, arr 已經是一個指針!

printf("First element using array notation: %d\n", arr[0]);
printf("First element using pointer notation: %d\n", *p);

// 我們可以使用指針算術來訪問其他元素
printf("Third element using pointer arithmetic: %d\n", *(p + 2));

這不是很酷嗎?我們可以像使用指針一樣使用 arr,因為在某種程度上,它就是一個指針!

指針與二維數組

現在我們已經掌握了基礎知識,讓我們升級到二維數組。這些就像表格或網格,有行和列。

聲明二維數組

這是我們如何聲明和初始化一個二維數組的方式:

int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};

這創建了一個 3x4 的整數網格。但這與指針有什麼關係?

二維數組與指針

一個二維數組實際上是一個指針數組,其中每個指針指向一個一維數組。讓我們分解一下:

int (*p)[4] = matrix;

printf("First element: %d\n", matrix[0][0]);
printf("Same element using pointer: %d\n", **p);

// 訪問其他元素
printf("Element at row 1, column 2: %d\n", matrix[1][2]);
printf("Same element using pointer: %d\n", *(*(p + 1) + 2));

在這個例子中,p 是一個指向 4 個整數數組的指針。每個 p + i 給我們一個指向行的指針,然後我們可以訪問該行中的單個元素。

指針與三維數組

準備好迎接最終大boss了嗎?三維數組!這些就像一堆二維數組。想象一個由數字組成的立方體。

聲明三維數組

這是我們如何聲明和初始化一個三維數組的方式:

int cube[2][3][4] = {
{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}},
{{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}
};

這創建了一個 2x3x4 的整數立方體。

三維數組與指針

就像二維數組一樣,我們可以使用指針來導航我們的三維數組:

int (*p)[3][4] = cube;

printf("First element: %d\n", cube[0][0][0]);
printf("Same element using pointer: %d\n", ***p);

// 訪問其他元素
printf("Element at layer 1, row 2, column 3: %d\n", cube[1][2][3]);
printf("Same element using pointer: %d\n", *(*(*(p + 1) + 2) + 3));

在這裡,p 是一個指向 3x4 數組的指針。每個層級的 * 轉換一個維度的數組。

結論

我們已經介紹了很多內容,從簡單的指針到複雜的三維數組。記住,掌握這些概念關鍵在於練習。嘗試自己寫代碼,嘗試不同的數組大小,並不要害怕犯錯誤——這是我們學習的方式!

這裡是一個我們所涵蓋的指針表示法的快速參考表:

數組類型 聲明 指針表示法
一維數組 int arr[5] int *p = arr
二維數組 int arr[3][4] int (*p)[4] = arr
三維數組 int arr[2][3][4] int (*p)[3][4] = arr

持續編程,持續探索,並記住——每個專家都曾經是一個初學者。你可以的!??️

Credits: Image by storyset