- 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語言 - return 語句
- 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語言中的指標鏈是一系列相互指向的指標。指標變數可以儲存另一個變數的地址,這個變數可以是任何型別,包括另一個指標,在這種情況下,它被稱為指向指標的指標。
指標鏈是指存在多個級別的指標。理論上,鏈的級別沒有限制,如下圖所示:
指標鏈的宣告
這可以用以下程式碼表示:
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