指針是 C 語言的靈魂,也是區分初學者與資深開發者的關鍵分水嶺。雖然概念簡單,但掌握指針能解鎖動態內存管理、數據結構構建等核心能力,是成為優秀 C 程序員的必經之路。
每個變量在內存中都佔據特定位置,通過 & 運算符可獲取其地址:
#include <stdio.h>
int main() {
int var1;
char var2[10];
printf("var1 位址: %p\n", (void*)&var1);
printf("var2 位址: %p\n", (void*)&var2);
return 0;
}
輸出示例:
var1 位址: 0x7ffee3b8c9ac var2 位址: 0x7ffee3b8c9a0
指針 本質是一個存儲「另一個變量地址」的變量。聲明語法:
type *var_name;
其中 type 為基礎數據類型,* 標識此為指針變量。常見聲明示例:
int *ip; // 整型指針 double *dp; // 雙精度指針 float *fp; // 浮點指針 char *ch; // 字符指針
所有指針值均為十六進制內存地址,區別僅在於指向數據的類型不同。
& 運算符)* 運算符)#include <stdio.h>
int main() {
int var = 20;
int *ip = &var; // 存儲 var 的地址
printf("var 位址: %p\n", (void*)&var);
printf("ip 存儲位址: %p\n", (void*)ip);
printf("*ip 解引用值: %d\n", *ip);
return 0;
}
輸出:
var 位址: 0x7ffee3b8c9ac ip 存儲位址: 0x7ffee3b8c9ac *ip 解引用值: 20
無法確定地址時,應初始化為 NULL(標準庫定義的零值常量):
int *ptr = NULL;
if (ptr) { /* 非空處理 */ }
if (!ptr) { /* 空指針處理 */ }
訪問地址 0 通常會導致段錯誤,因為該區域由作業系統保留。良好習慣:聲明即初始化,使用前檢查非空。
| 概念 | 說明 |
|---|---|
| 指針算術運算 | 支援 ++、--、+、-,按數據類型大小移動 |
| 指針數組 | 存儲多個指針的數組,如 int *ptr_arr[10] |
| 指向指針的指針 | 多級間接引用,如 int **pptr |
| 傳遞指針給函數 | 實現傳址調用,允許函數修改實參值 |
| 函數返回指針 | 可返回局部靜態變量、動態分配內存地址(嚴禁返回局部自動變量地址) |
深入理解這些概念,將為您掌握鏈表、樹、圖等動態數據結構奠定堅實基礎。