| 名詞 | 本質 | 宣告範例 |
|---|---|---|
| 指標函數 | 函數(回傳值是指標) | int *func(void); |
| 函數指標 | 指標(指向函數) | int (*func)(void); |
本質是函數,其回傳類型為指標。例如:
int *create_array(int n) {
int *p = malloc(n * sizeof(int));
return p; // 回傳指標
}
本質是指標變數,儲存函數入口位址。兩大用途:
int add(int a, int b) { return a + b; }
int (*fp)(int, int); // 宣告函數指標
fp = add; // 指向 add
int result = fp(3, 4); // 間接呼叫,結果 7
將函數指標(位址)作為參數傳給另一函數,當該指標被用來呼叫其指向的函數時,即為回調。
int cmp_int(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int arr[] = {5,2,8,1};
qsort(arr, 4, sizeof(int), cmp_int); // cmp_int 為回調函數
void process(void (*callback)(int)) {
for (int i = 0; i < 5; i++) callback(i);
}
void print_square(int x) { printf("%d ", x*x); }
int main() {
process(print_square); // 0 1 4 9 16
return 0;
}
int (*fp)(int); 讀法:fp 是指標 → 指向函數 → 參數 int → 回傳 int
優先級:() (函數呼叫/分組) > * (指標) > 類型修飾詞
| 錯誤寫法 | 正確寫法 | 說明 |
|---|---|---|
int *fp(int); | int (*fp)(int); | 前者是回傳指標的函數宣告 |
fp = &func; | fp = func; | 函數名本身即地址,&可省略 |
void cb(int *p); | void (*cb)(int); | 參數宣告需加括號區分 |