首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言函數指標、指標函數與回調函數徹底解析

     編輯:關於C語言

一眼區分:看最後兩個字

名詞本質宣告範例
指標函數函數(回傳值是指標)int *func(void);
函數指標指標(指向函數)int (*func)(void);

指標函數

本質是函數,其回傳類型為指標。例如:

int *create_array(int n) {
    int *p = malloc(n * sizeof(int));
    return p;  // 回傳指標
}

函數指標

本質是指標變數,儲存函數入口位址。兩大用途:

  1. 間接呼叫函數
  2. 作為函數參數傳遞(回調核心)
int add(int a, int b) { return a + b; }
int (*fp)(int, int);  // 宣告函數指標
fp = add;             // 指向 add
int result = fp(3, 4); // 間接呼叫,結果 7

回調函數

將函數指標(位址)作為參數傳給另一函數,當該指標被用來呼叫其指向的函數時,即為回調。

經典場景:qsort比較函數

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);參數宣告需加括號區分
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved