C語言中的指標指標(雙指標)



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

C語言中的**指標指標**,也稱為**雙指標**,用於儲存另一個指標的地址。

C語言中儲存另一個變數地址的變數稱為**指標**。指標變數可以儲存任何型別的地址,包括基本資料型別、陣列、結構體型別等。同樣,指標也可以儲存另一個指標的地址,在這種情況下,它被稱為**“指標指標”**(也稱為**“雙指標”**)。

“指向指標的指標”是一種**多級間接定址**或**指標鏈**的形式。通常,指標包含變數的地址。當我們定義“指向指標的指標”時,第一個指標包含第二個指標的地址,第二個指標指向包含實際值的位置,如下所示:

Pointer to Pointer

指標指標的宣告

**指標指標**(**雙指標**)的宣告類似於指標的宣告,唯一的區別是需要在指標變數名前使用一個額外的星號(**\***)。

示例

例如,以下宣告聲明瞭一個int型別的**指標指標**:

int **var;

當目標值由“指向指標的指標”間接指向時,訪問該值需要應用兩次星號運算子。

指標指標(雙指標)示例

以下示例演示了在C語言中宣告、初始化和使用指標指標(雙指標)。

#include <stdio.h>

int main() {
  // An integer variable
  int a = 100;

  // Pointer to integer
  int *ptr = &a;

  // Pointer to pointer (double pointer)
  int **dptr = &ptr;

  printf("Value of 'a' is : %d\n", a);
  printf("Value of 'a' using pointer (ptr) is : %d\n", *ptr);
  printf("Value of 'a' using double pointer (dptr) is : %d\n", **dptr);

  return 0;
}

輸出

Value of 'a' is : 100
Value of 'a' using pointer (ptr) is : 100
Value of 'a' using double pointer (dptr) is : 100

普通指標在C語言中是如何工作的?

假設一個整數變數**“a”**位於任意地址1000。它的指標變數是**“b”**,編譯器為它分配地址2000。下圖顯示了視覺化描述:

Normal Pointer

讓我們宣告一個指向int型別的指標,並將int變數的地址儲存在其中。

int a = 10;
int *b = &a;

**解引用運算子**透過指標獲取值。

printf("a: %d \nPointer to 'a' is 'b': %d \nValue at 'b': %d", a, b, *b);

示例

這是一個完整的程式,顯示了普通指標是如何工作的:

#include <stdio.h>

int main(){

   int a = 10;
   int *b = &a;
   printf("a: %d \nPointer to 'a' is 'b': %d \nValue at 'b': %d", a, b, *b);

   return 0;
}

輸出

它將列印int變數的值、它的地址以及透過解引用指標獲得的值:

a: 10 
Pointer to 'a' is 'b': 6422036 
Value at 'b': 10

雙指標是如何工作的?

現在讓我們宣告一個可以儲存“b”地址的指標,“b”本身是指向int型別的指標,寫成**“int \*”**。

讓我們假設編譯器也為它分配地址3000。

Double Pointer

因此,**“c”**是指向int型別的指標的指標,應該宣告為**“int \*\*”**。

int **c = &b;
printf("b: %d \nPointer to 'b' is 'c': %d \nValue at b: %d\n", b, c, *c);

您可以獲得“b”(它是“a”的地址)的值、“c”(它是“b”的地址)的值以及從“c”解引用的值(它是“a”的地址):

b: 6422036 
Pointer to b is c: 6422024 
Value at b: 6422036

這裡,“c”是雙指標。其宣告中的第一個星號指向“b”,第二個星號依次指向“a”。因此,我們可以使用雙重解引用指標從“c”獲取“a”的值。

printf("Value of 'a' from 'c': %d", **c);

這應該顯示'a'的值為10。

示例

這是一個完整的程式,顯示了雙指標是如何工作的:

#include <stdio.h>

int main(){

   int a = 10;
   int *b = &a;
   printf("a: %d \nAddress of 'a': %d \nValue at a: %d\n\n", a, b, *b);

   int **c = &b;
   printf("b: %d \nPointer to 'b' is c: %d \nValue at b: %d\n", b, c, *c);
   printf("Value of 'a' from 'c': %d", **c);

   return 0;
}

輸出

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

a: 10 
Address of 'a': 1603495332 
Value at a: 10

b: 1603495332 
Pointer to 'b' is c: 1603495336 
Value at b: 1603495332
Value of 'a' from 'c': 10

雙指標的行為就像普通指標一樣

C語言中的“指標指標”或“雙指標”的行為就像普通指標一樣。因此,雙指標變數的大小始終等於普通指標。

我們可以透過對上述程式中的指標“b”和“c”應用**sizeof運算子**來檢查它:

printf("Size of b - a normal pointer: %d\n", sizeof(b));
printf("Size of c - a double pointer: %d\n", sizeof(c));

這顯示了兩個指標的大小相等:

Size of b - a normal pointer: 8
Size of c - a double pointer: 8

**注意:**上述示例中顯示的不同指標變數的大小和地址可能會有所不同,因為它取決於諸如CPU架構和作業系統之類的因素。但是,它們將顯示一致的結果。

C語言中的多級指標(三級指標可能嗎?)

理論上,指標宣告中出現的星號數量沒有限制。

如果您確實需要指向**“c”**(在上例中),它將是“指向指向指標的指標”,可以宣告為:

int ***d = &c;

通常,雙指標用於引用二維陣列或字串陣列。

廣告