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

C語言函數指針完全指南:聲明、回調、動態排序、返回函數指針

     編輯:關於C語言

函數指針深度實戰:從聲明語法到回調、策略模式、工廠模式

系統講解函數指針聲明、調用、回調函數、動態排序策略、函數指針作返回值構建函數表驅動,附完整可運行代碼示例。

1. 基礎聲明與調用


// 聲明:返回類型 (*指針名)(參數列表)
int (*p)(int, int) = sum;  // 指向 int sum(int,int)

// 調用兩種等價形式
p(3, 5);       // 直接調用
(*p)(3, 5);    // 解引用調用

2. 回調函數模式


// 通用搜索函數,接受回調處理匹配項
void search(Student *stu, void (*callback)(Student*)) {
    if (stu->score >= 90) callback(stu);
}

// 具體回調實現
void addString(Student *s) {
    strcat(s->name, "高富帥");
}

// 使用
search(&stu[i], addString);

核心:將「做什麼」作為參數傳遞,實現算法與業務邏輯分離。

3. 動態排序策略模式


// 比較函數類型
typedef int (*CompareFn)(Student*, Student*);

// 具體策略
int cmpAgeAsc(Student *a, Student *b) { return a->age > b->age; }
int cmpScoreDesc(Student *a, Student *b) { return a->score < b->score; }

// 通用排序
void sortStudent(Student *arr, int n, CompareFn cmp) {
    // 冒泡排序框架
    for (int i = 0; i < n-1; i++)
        for (int j = 0; j < n-1-i; j++)
            if (cmp(arr+j, arr+j+1)) swap(arr+j, arr+j+1);
}

// 運行時切換策略
sortStudent(stu, 5, cmpAgeAsc);   // 年齡升序
sortStudent(stu, 5, cmpScoreDesc); // 成績降序

4. 函數指針作返回值:函數表驅動


typedef int (*MathFn)(int, int);

typedef struct { char name[20]; MathFn fn; } FnEntry;

MathFn getFnByName(FnEntry *table, int n, char *name) {
    for (int i = 0; i < n; i++)
        if (strcmp(table[i].name, name) == 0)
            return table[i].fn;
    return NULL;
}

// 函數表
FnEntry table[] = {
    {"add", add}, {"sub", sub}, {"mul", mul}, {"div", div}
};

// 動態調用
MathFn fn = getFnByName(table, 4, "add");
if (fn) printf("%d", fn(3, 5));  // 8

5. 進階:狀態機與事件驅動


typedef void (*StateHandler)(Event*);

StateHandler stateTable[STATE_COUNT][EVENT_COUNT] = {
    {handleIdle, handleStart, ...},
    {handleRun, handleStop, ...},
    ...
};

// 事件循環
while (running) {
    Event e = getEvent();
    StateHandler h = stateTable[currentState][e.type];
    if (h) h(&e);
}

核心優勢總結

模式解決問題關鍵詞
回調異步通知/擴展點參數化行為
策略算法族運行時切換開閉原則
函數表字符串動態分發O(1)查找
狀態機複雜狀態轉換表驅動

函數指針是 C 語言實現多態、依賴倒置、插件架構的核心機制,掌握它即掌握 C 語言面向對象設計的精髓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved