
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策機制
- C語言 - 決策機制
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - 返回語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標算術
- C語言 - 指標陣列
- C語言 - 指標指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的區別
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近指標、遠指標和巨指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的區別
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點號 (.) 運算子
- C語言 - 列舉 (enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入輸出
- C語言 - 檔案 I/O(檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 編譯指示
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C語言程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言中的指標指標(雙指標)
什麼是C語言中的雙指標?
C語言中的**指標指標**,也稱為**雙指標**,用於儲存另一個指標的地址。
C語言中儲存另一個變數地址的變數稱為**指標**。指標變數可以儲存任何型別的地址,包括基本資料型別、陣列、結構體型別等。同樣,指標也可以儲存另一個指標的地址,在這種情況下,它被稱為**“指標指標”**(也稱為**“雙指標”**)。
“指向指標的指標”是一種**多級間接定址**或**指標鏈**的形式。通常,指標包含變數的地址。當我們定義“指向指標的指標”時,第一個指標包含第二個指標的地址,第二個指標指向包含實際值的位置,如下所示:

指標指標的宣告
**指標指標**(**雙指標**)的宣告類似於指標的宣告,唯一的區別是需要在指標變數名前使用一個額外的星號(**\***)。
示例
例如,以下宣告聲明瞭一個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。下圖顯示了視覺化描述:

讓我們宣告一個指向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。

因此,**“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;
通常,雙指標用於引用二維陣列或字串陣列。