C語言中的指標鏈



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

C語言中的指標鏈是一系列相互指向的指標。指標變數可以儲存另一個變數的地址,這個變數可以是任何型別,包括另一個指標,在這種情況下,它被稱為指向指標的指標

指標鏈是指存在多個級別的指標。理論上,鏈的級別沒有限制,如下圖所示:

Chain of Pointers

指標鏈的宣告

這可以用以下程式碼表示:

int a = 10;
int *x = &a;
int **y = &x;
int ***z = &y;

在上面的例子中,“x”是指向“int”型別的指標,如符號“int *”所示。要在“y”中儲存“x”的地址,“y”應該是指向指向int的指標,即“int **”。

類似地,“z”是“指向指向指向int的指標”的指標,因此其宣告中星號出現了三次,即“int ***”。

解引用是如何工作的?

我們知道“*x”返回儲存在“x”中的地址處的值,即“a”的值。

根據相同的邏輯,“*y”應該返回它的值(參考上圖),它是1000,這反過來又是“a”的地址。因此,“y”的雙重解引用(即“**y”)應該給出“a”的值。

此外,“z”的三重解引用(即“***z”)應該給出“a”的值。

示例

下面的例子展示了“雙重解引用”和“三重解引用”是如何工作的:

#include <stdio.h>

int main(){

   int a = 10;

   int *x = &a;
   int **y = &x;
   int ***z = &y;

   printf("a: %d\n", a);

   printf("a: %d\n", *x);   // dereferencing x;
   printf("a: %d\n", **y);  // double dereferencing y;
   printf("a: %d\n", ***z); // triple dereferencing z;

   return 0;
}

輸出

請注意,所有三種解引用情況都列印了“a”的值:

a: 10
a: 10
a: 10
a: 10

浮點型指標鏈

我們可以遵循相同的邏輯來建立一個浮點型指標鏈,並應用多級解引用來獲取浮點型變數的值。

示例

下面的例子展示瞭如何使用浮點型指標鏈:

#include <stdio.h>

int main(){

   float a = 10.25;

   float *x = &a;
   float **y = &x;
   float ***z = &y;

   printf("a: %f\n", a);
   printf("a: %f\n", *x);
   printf("a: %f\n", **y);
   printf("a: %f\n", ***z);

   return 0;
}

輸出

執行程式碼並檢查其輸出:

a: 10.250000
a: 10.250000
a: 10.250000
a: 10.250000

透過解引用更新原始變數

我們還可以透過解引用來更新原始變數的值。請看下面的語句:

*x = 11.25;

它會相應地更改“a”的值。類似地,它可以使用後續級別的指標進行更新。

示例

下面的程式展示瞭如何使用不同級別的解引用來更新原始變數:

#include <stdio.h>

int main(){

   float a = 10.25;;

   float *x = &a;
   float **y = &x;
   float ***z = &y;

   printf("a: %f\n", a);

   // update with first pointer
   *x = 11.25;
   printf("a: %f\n", *x);

   // update with second pointer
   **y = 12.25;
   printf("a: %f\n", **y);

   // update with third pointer
   ***z = 13.25;
   printf("a: %f\n", ***z);

   return 0;
}

輸出

執行程式碼並檢查其輸出:

a:10.250000
a:11.250000
a:12.250000
a:13.250000

字元型指標鏈

字串表示為“char”型別的陣列或指向“char”型別的指標:

char *a = "Hello";

因此,我們可以建立一個字元型指標鏈。

注意:唯一的區別是,這裡的原始變數本身就是一個指標,因此與前面的例子相比,上層指標多了一個星號

示例

下面的例子展示了字元型指標鏈是如何工作的:

#include <stdio.h>

int main(){

   char *a = "Hello";

   char **x = &a;
   char ***y = &x;
   char ****z = &y;

   printf("a: %s\n", a);
   printf("a: %s\n", *x);
   printf("a: %s\n", **y);
   printf("a: %s\n", ***z);

   return 0;
}

輸出

執行這段程式碼時,會產生以下輸出:

a: Hello
a: Hello
a: Hello
a: Hello

指標鏈對於建立連結串列和其他資料結構很有用。

廣告
© . All rights reserved.