多級指針是C語言指針系統的皇冠明珠,也是區分初中級開發者的關鍵考點。本文從雙重指針講起,層層遞進至五級指針,通過完整可運行代碼演示如何通過多層間接訪問修改原始變量值,並揭示指針變量「只存地址不存值」的核心本質。
| 層級 | 聲明 | 指向對象 | 解引用次數 | 修改原值語法 |
|---|---|---|---|---|
| 一級 | int *p | int變量 | 1次(*p) | *p = val |
| 二級 | int **p | int*指針 | 2次(**p) | **p = val |
| 三級 | int ***p | int**指針 | 3次(***p) | ***p = val |
| 四級 | int ****p | int***指針 | 4次(****p) | ****p = val |
| 五級 | int *****p | int****指針 | 5次(*****p) | *****p = val |
內存佈局圖解
valInt (0x7ffe...) = 10 → pInt (0x7ffe...) = &valInt → &pInt (0x7ffe...) 傳給函數 函數參數 ppInt = &pInt **ppInt = *(*ppInt) = *pInt = valInt = 100核心原則:指針變量只存地址
void allocate(int **ptr, size_t size) { *ptr = malloc(size * sizeof(int)); // 修改一級指針指向 } int *p = NULL; allocate(&p, 10); // 傳遞二級指針,函數內修改p指向2. 二維數組動態分配
int main(int argc, char **argv) { // argv是二級指針 for (int i = 0; i < argc; i++) { printf("argv[%d] = %s\n", i, argv[i]); // argv[i]是一級指針(char*) } }4. 回調函數上下文傳遞
// 使用void*和字節偏移實現通用指針鏈遍歷(教學演示) void printPointerChain(void *ptr, int levels, size_t elemSize) { void *current = ptr; for (int i = 0; i < levels; i++) { printf("Level %d: %p\n", i, current); if (i == levels - 1) break; // 假設統一指針大小 current = *(void**)current; } }多級指針雖然層層遞進令人望而生畏,但其本質始終是「地址的地址的...地址」。掌握「聲明層級 = 解引用層級 = 間接訪問深度」這一核心規律,配合系統性的指針鏈構建練習,即可駕馭任意層級的指針操作。建議在調試器中單步觀察內存佈局,建立直觀的空間想像力。