C 語言中的指標數組

你好,未來的程序設計大師!今天,我們將進入C語言的奇妙世界,特別是探索指標數組的精彩概念。如果這聽起來起初讓人畏難,不必擔心 – 我保證在這篇教程結束時,你將能夠像專家一樣熟練地使用這個強大的工具!

C - Array of Pointers

什麼是指標數組?

在我們深入探究之前,先從基礎開始。想象一下,你有一把魔法棒(指標),每根都能召喚不同的法術(數據)。現在,如果你能夠將這些魔法棒整齊地排列成一排(數組),這不就是指標數組的精髓所在嗎? – 一系列記憶體地址,排列整齊,等待行動!

在C語言中,指標數組簡單來說就是一個數組,其每個元素都是一個指標。這些指標可以指向各種數據類型,如整數、字符,甚至複雜的結構體。

創建指標數組

讓我們從創建第一個指標數組開始。其語法與創建普通數組非常相似,但有一點小變化:

data_type *array_name[size];

在這裡,data_type 是指標將指向的數據類型,array_name 是你想要稱呼你的數組的名稱,而 size 是你想要在數組中擁有的指標數量。

以下是一個簡單示例來看看這是如何實現的:

#include <stdio.h>

int main() {
int *number_pointers[5];  // 声明一個包含5個整數指標的數組

int a = 10, b = 20, c = 30, d = 40, e = 50;

// 將地址賦值給指標
number_pointers[0] = &a;
number_pointers[1] = &b;
number_pointers[2] = &c;
number_pointers[3] = &d;
number_pointers[4] = &e;

// 輸出每個指標指向的值
for(int i = 0; i < 5; i++) {
printf("number_pointers[%d] 的值 = %d\n", i, *number_pointers[i]);
}

return 0;
}

在這個示例中,我們創建了一個包含5個整數指標的數組。然後,我們將五個整數變量的地址賦值給這些指標。最後,我們輸出每個指標指向的值。

當你運行此代碼時,你將看到:

number_pointers[0] 的值 = 10
number_pointers[1] 的值 = 20
number_pointers[2] 的值 = 30
number_pointers[3] 的值 = 40
number_pointers[4] 的值 = 50

這不是魔法嗎?我們剛剛創建了第一個指標數組!

整數指標數組

現在我們已經對指標數組有了初步的了解,讓我們更深入地探究一下整數指標數組。這在你想處理多個數組或需要對數組進行排序而不實際移動數據時特別有用。

以下是一個示例,演示了如何使用整數指標數組對數字進行排序,而不用移動實際的數據:

#include <stdio.h>

void swap(int **a, int **b) {
int *temp = *a;
*a = *b;
*b = temp;
}

int main() {
int numbers[] = {50, 30, 20, 10, 40};
int *ptr[5];

// 初始化指標
for(int i = 0; i < 5; i++) {
ptr[i] = &numbers[i];
}

// 根據指標指向的值對指標進行排序
for(int i = 0; i < 5; i++) {
for(int j = i + 1; j < 5; j++) {
if(*ptr[i] > *ptr[j]) {
swap(&ptr[i], &ptr[j]);
}
}
}

// 輸出排序後的值
printf("排序後的值: ");
for(int i = 0; i < 5; i++) {
printf("%d ", *ptr[i]);
}

// 原數組保持不變
printf("\n原始數組: ");
for(int i = 0; i < 5; i++) {
printf("%d ", numbers[i]);
}

return 0;
}

這段代碼展示了指標數組的一個強大用處。我們根據指標指向的值對指標進行排序,從而有效地對數據進行排序,而不移動原始值。這就像重新排列魔法棒而不干擾它們召喚的法術一樣!

字符指標數組

接下來,讓我們探究字符指標數組。當你在C中處理字符串時,這非常有用。事實上,當你在C中聲明一個字符串數組時,你真正創建的就是一個字符指標數組!

以下是一個說明這一點的示例:

#include <stdio.h>

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

int num_fruits = sizeof(fruits) / sizeof(fruits[0]);

printf("我們的水果籃子裡有:\n");
for(int i = 0; i < num_fruits; i++) {
printf("%s\n", fruits[i]);
}

// 讓我們試試改變一個水果
fruits[1] = "Blueberry";

printf("\n經過一點魔法,我們的水果籃子現在包含:\n");
for(int i = 0; i < num_fruits; i++) {
printf("%s\n", fruits[i]);
}

return 0;
}

在這個水果示例中,我們創建了一個字符指標數組(字符串)。fruits 數組的每個元素都是指向每個水果名稱的第一個字符的指標。

這裡的魔法在於,我們可以輕鬆地改變整個字符串,只需更改指標,就像我們將 "Banana" 變為 "Blueberry" 一樣。這就像用魔杖一揮換掉整個法術書一樣!

結構指標數組

最後但同樣重要的是,讓我們探究指標數組的最複雜(也最令人興奮)的用途 – 指向結構。當你處理複雜的數據類型並希望有效地操縱它們時,這非常有力。

以下是一個演示這個概念的示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Wizard {
char name[50];
char spell[50];
int power;
};

int main() {
struct Wizard *wizard_pointers[3];

// 創建並初始化巫師
for(int i = 0; i < 3; i++) {
wizard_pointers[i] = (struct Wizard*)malloc(sizeof(struct Wizard));

printf("Enter wizard name: ");
scanf("%s", wizard_pointers[i]->name);

printf("Enter wizard's favorite spell: ");
scanf("%s", wizard_pointers[i]->spell);

printf("Enter wizard's power level: ");
scanf("%d", &wizard_pointers[i]->power);

printf("\n");
}

// 輸出巫師信息
printf("Our mighty wizards:\n");
for(int i = 0; i < 3; i++) {
printf("Wizard: %s, Favorite Spell: %s, Power Level: %d\n",
wizard_pointers[i]->name,
wizard_pointers[i]->spell,
wizard_pointers[i]->power);
}

// 別忘了釋放分配的記憶體!
for(int i = 0; i < 3; i++) {
free(wizard_pointers[i]);
}

return 0;
}

在這個魔法示例中,我們創建了一個指向 Wizard 結構的指標數組。這允許我們為每個巫師動態分配記憶體,並使用箭頭運算符(->)訪問他們的屬性。

這種方法使我們能夠輕鬆地創建和操作複雜的數據結構。這就像擁有一本可以動態添加新法術的魔法書一樣!

以上就是了,年輕的程序設計師!我們已經走過了C語言中指標數組的领域,從基礎到更進階的概念。記住,就像任何強大的魔法一樣,指標數組需要練習才能掌握。所以別害怕實驗並創造你自己的魔法程序!

以下是我們涵蓋的方法的快速參考表:

方法 描述
data_type *array_name[size]; 声明指標數組
array_name[index] = &variable; 將地址賦值給數組中的指標
*array_name[index] 訪問數組中指標指向的值
array_name[index]->member 訪問數組中指標指向的結構的成員

繼續練習,保持好奇心,你將能夠像經驗豐富的巫師一樣輕鬆地召喚複雜的程序。開心編程!

Credits: Image by storyset