C語言中指針數組的初始化

你好,未來的編程超新星們!今天,我們將要深入探索C語言中指針數組的迷人世界。如果你是編程新手,別擔心——我會一步一步地引導你,就像我過去幾年來為無數學生做的那樣。所以,拿起你喜歡的飲料,讓我們一起踏上這個令人興奮的旅程吧!

C - Initialization of Pointer Arrays

如何在C語言中初始化指針數組?

在我們深入初始化指針數組的細節之前,讓我們快速複習一下什麼是指針。想像一下指針就像是指向電腦記憶體中位置的指示牌。現在,當我們談到指針數組時,把它想像成一排指示牌,每個都指向不同的位置。

讓我們從一個簡單的例子開始:

int *ptr_array[5];

這行代碼聲明了一個包含5個整數指針的數組。但等一下!我們這裡只是建立了指示牌,並不是它們指向的實際數據。這就像在新建的城鎮中設置空的指示牌——它們在那裡,但還沒有指向任何有用的地方。

為了讓我們的指針數組真正有用,我們需要初始化它。以下是如何操作的:

int a = 10, b = 20, c = 30, d = 40, e = 50;
int *ptr_array[5] = {&a, &b, &c, &d, &e};

在這個例子中,我們創建了五個整數變量,然後將我們的指針數組初始化為指向這些變量。這就像我們終於在指示牌上寫上了目的地!

使用 static 鍵字初始化指針數組

現在,讓我們來談談 static 鍵字。在C語言中,static 就像是個魔法詞,它讓變量在程序運行的整個過程中都保持存在。當我們在指針數組中使用 static 時,它保證了數組只會被初始化一次,並在函數調用之間保留其值。

以下是一個例子:

static int *ptr_array[3] = {NULL, NULL, NULL};

這創建了一個包含三個整數指針的靜態數組,所有指針最初都指向 NULL。這就像在我們的城鎮中設置了三個永久的指示牌,但我們還沒有決定它們應該指向哪裡。

初始化整數指針數組

讓我們來得更實際一些。假設我們想要創建一個指針數組,每個指針指向不同的整數。以下是如何操作的:

int num1 = 10, num2 = 20, num3 = 30;
int *int_ptr_array[3] = {&num1, &num2, &num3};

for (int i = 0; i < 3; i++) {
printf("int_ptr_array[%d] 的值: %d\n", i, *int_ptr_array[i]);
}

在這段代碼中,我們創建了三個整數和一個指向這些整數的指針數組。然後,我們使用一個 for 循環來打印出這些值。這就像我們在城鎮中設置了三個指示牌,每個都指向一個帶有不同的數字的房子,然後我們在城鎮中進行巡遊來讀取所有的房子號碼!

使用直接地址初始化指針數組

有時候,我們可能想要使用直接的記憶體地址來初始化指針數組。雖然這個方法不常見,但了解其工作原理是很有用的:

int *direct_addr_array[3] = {(int*)100, (int*)200, (int*)300};

for (int i = 0; i < 3; i++) {
printf("direct_addr_array[%d] 的地址: %p\n", i, (void*)direct_addr_array[i]);
}

在這裡,我們使用特定的記憶體地址來初始化我們的數組。這就像我們把指示牌設置到我們城鎮中非常特定的GPS座標。但請謹慎使用這種方法——如果你不知道自己在做什麼,指向任意的記憶體地址可能會很危險!

使用基址遍歷數組

現在,讓我們學習一個很酷的技巧。我們可以使用指針算術來使用數組的基址進行遍歷。以下是如何操作的:

int numbers[5] = {10, 20, 30, 40, 50};
int *base_ptr = numbers;  // base_ptr 現在指向 numbers 的第一個元素

for (int i = 0; i < 5; i++) {
printf("索引 %d 的值: %d\n", i, *(base_ptr + i));
}

在這個例子中,base_ptr 指向我們 numbers 數組的第一個元素。通過將 i 加到 base_ptr 上,我們可以訪問數組的每個元素。這就像我們有一個魔法的指示牌,只要告訴它移動多少步,它就能指向我們城鎮中的任何房子!

初始化字符指針數組(字符串)

字符指針數組在C語言中常被用來存儲字符串。以下是一個例子:

char *fruits[] = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};

for (int i = 0; i < 5; i++) {
printf("水果 %d: %s\n", i+1, fruits[i]);
}

在這段代碼中,我們創建了一個指向字符串文字的字符指針數組。這就像我們在城鎮的農夫市場中設置了指示牌,每個都指向不同的水果攤位!

初始化動態數組的指針

最後,讓我們來談談動態分配我們的指針數組。這在我們在編譯時不知道數組大小時很有用:

int n = 3;  // 我們可以在運行時更改這個值
int **dynamic_ptr_array = (int**)malloc(n * sizeof(int*));

for (int i = 0; i < n; i++) {
dynamic_ptr_array[i] = (int*)malloc(sizeof(int));
*dynamic_ptr_array[i] = i * 10;
}

for (int i = 0; i < n; i++) {
printf("dynamic_ptr_array[%d] 的值: %d\n", i, *dynamic_ptr_array[i]);
}

// 不要忘記釋放分配的記憶體!
for (int i = 0; i < n; i++) {
free(dynamic_ptr_array[i]);
}
free(dynamic_ptr_array);

這就像在我們的城鎮中按需建造一個新社區。我們首先創建指示牌(dynamic_ptr_array),然後對於每個指示牌,我們建造一個房子(malloc(sizeof(int)))並在其中放入一個數字(i * 10)。在我們使用完我們的社區後,我們會清理並釋放分配的記憶體。

這就是關於C語言中指針數組的旅程,各位!記住,熟能生巧,所以不要害怕嘗試這些概念。祝你編程愉快!

Credits: Image by storyset