C 語言中的指針鏈

你好,未來的編程魔法師們!今天,我們將踏上一段令人興奮的旅程,進入 C 語言中指針鏈的神奇世界。別擔心如果你是編程新手——我將成為你的友好導遊,我們將一步一步地攻克這個主題。所以,拿起你的虛擬魔杖(鍵盤),我們一起來探險吧!

C - Chain of Pointers

C 語言中的指針鏈是什麼?

想像你正在進行一場藏寶遊戲,而不是地圖,你有一系列的線索。每個線索都指向下一個,形成一條最終引向寶藏的鏈。這就是 C 語言中指針鏈的基本概念!

在 C 語言編程中,指針鏈是一系列指針,其中每個指針都指向另一個指針,除了最後一個,它通常指向一個特定數據類型的變量。

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

int value = 42;
int *ptr1 = &value;
int **ptr2 = &ptr1;
int ***ptr3 = &ptr2;

在這段代碼中:

  • value 是我們的寶藏(一個值為 42 的整數)。
  • ptr1 是一個指針,它持有 value 的地址。
  • ptr2 是一個指向指針的指針(注意雙重星號),它持有 ptr1 的地址。
  • ptr3 是一個指向指針的指針的指針(三重星號!)它持有 ptr2 的地址。

這就像一個俄羅斯套娃的指針!?

如何進行解引用?

現在,讓我們來談談解引用。解引用就像打開每個套娃來找到裡面的那個。在我們的指針鏈中,我們使用星號(*)來解引用。

printf("值:%d\n", ***ptr3);

這行代碼可能看起來有點可怕,有三個星號,但讓我們分解一下:

  1. *ptr3 給我們 ptr2 中存儲的地址
  2. **ptr3(或 *(*ptr3))給我們 ptr1 中存儲的地址
  3. ***ptr3(或 *(*(*ptr3)))最終給我們 value 的值,也就是 42

這就像說,“打開大娃娃,然後打開裡面的中號娃娃,再打開那個裡面的小娃娃來找到寶藏!”

浮點數指針的鏈

讓我們用浮點數試試:

float pi = 3.14159;
float *fPtr1 = π
float **fPtr2 = &fPtr1;
float ***fPtr3 = &fPtr2;

printf("pi 的值:%f\n", ***fPtr3);

這個例子與我們的整數例子工作方式相同,只是使用浮點數。當我們打印 ***fPtr3 時,我們沿著指針鏈一直追溯到 pi 的值。

通過解引用更新原始變量

指針鏈的一個很酷的功能是,我們可以用它來修改原始值。讓我們看看如何操作:

int score = 85;
int *scorePtr1 = &score;
int **scorePtr2 = &scorePtr1;

printf("原始分數:%d\n", score);

**scorePtr2 = 90;  // 通過指針鏈更新值

printf("更新後的分數:%d\n", score);

在這個例子中,我們使用 **scorePtr2 來改變 score 的值。這就像通過一串人傳遞消息來更新得分板!

字符指針的鏈

讓我們以一個稍微複雜一點的例子結束,使用字符指針:

char letter = 'A';
char *charPtr1 = &letter;
char **charPtr2 = &charPtr1;
char ***charPtr3 = &charPtr2;

printf("原始字母:%c\n", ***charPtr3);

**charPtr2 = 'B';  // 更新值

printf("更新後的字母:%c\n", letter);

這個例子與我們之前的例子工作方式相同,只是使用字符。我們可以用指針鏈將我們的字母從 'A' 改變為 'B'。

方法總結

這裡有一個方便的表格,總結了我們討論的方法:

方法 描述 示例
創建指針 使用 & 運算符來獲取變量的地址 int *ptr = &value;
解引用 使用 * 運算符來訪問指針指向的值 int x = *ptr;
創建指向指針的指針 使用雙重星號 ** int **ptr2 = &ptr1;
解引用指針鏈 使用多個星號 int value = ***ptr3;
通過指針鏈更新 使用解引用的指針來賦值 **ptr2 = 90;

好了,各位!我們已經穿越了 C 語言中指針鏈的蜿蜒小徑。記住,熟能生巧,所以不要害怕嘗試這些概念。在你還未意識到之前,你可能已經像馬戲團的表演者一樣玩轉指針了!?

快樂編程,願你的指針總是指向正確的方向!?

Credits: Image by storyset