指針是 C 語言的靈魂,直接操作記憶體地址,賦予程式員極致控制力。本文系統梳理指針定義、初始化、解引用、與數組/字符串/函數的關係,構建完整指針知識圖譜。
int* 訪問 4 字節,char* 訪問 1 字節)。int *p; char *c;,* 屬於聲明符一部分。int a=10; int *p = &a; 取地址賦值。int a = 12;
int *p = &a;
int b = *p; // b = 12,通過 p 訪問 a 所在記憶體
*p = 20; // 修改 a 為 20
*p 相當於「以 p 為地址訪問記憶體」,是左值(可賦值)。
arr 是指針常量,值為 &arr[0](首元素地址),不可修改(arr++ 非法)。arr[i] 等價 *(arr + i),下標操作本質是指針算術 + 解引用。p + 1 移動 sizeof(*p) 字節,類型決定步長。char arr[] = "abc"; 字符數組(棧上,可修改)。char *p = "abc"; 字符指針指向常量區字面值(不可修改,*p = 'x' 崩潰)。char *arr[2] = {"hi", "hello"}; 指針數組,每項指向常量區。| 概念 | 定義 | 例子 |
|---|---|---|
| 指針型函數 | 返回指針的函數 | int* foo() |
| 函數指針 | 指向函數代碼區的指針 | int (*fp)(int) = foo; |
| 回調函數 | 作為參數傳遞的函數指針 | void sort(int*, int, int(*)(int,int)) |
函數指針可實現多態、策略模式、事件回調,是 C 語言面向對象編程的基石。
const int *p / int const *p:指向常量的指針(*p 不可改,p 可改)。int *const p:常量指針(p 不可改,*p 可改)。const int *const p:雙重常量。指針 = 地址 + 類型。掌握類型決定步長與訪問寬度、數組名退化為指針、字符串字面值存常量區、函數指針實現回調,即掌握 C 語言核心威力。