
- C程式設計教程
- C - 首頁
- C語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境搭建
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof運算子
- C - 運算子優先順序
- C - 其他運算子
- C語言中的決策
- C - 決策
- C - if語句
- C - if...else語句
- C - 巢狀if語句
- C - switch語句
- C - 巢狀switch語句
- C語言中的迴圈
- C - 迴圈
- C - while迴圈
- C - for迴圈
- C - do...while迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break語句
- C - continue語句
- C - goto語句
- C語言中的函式
- C - 函式
- C - 主函式
- C - 按值呼叫函式
- C - 按引用呼叫函式
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者自定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 可變長陣列
- C語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指標到指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void指標
- C - 懸空指標
- C - 解引用指標
- C - 近、遠和巨型指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點(.)運算子
- C - 列舉(或enum)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - Typedef
- C語言中的檔案處理
- C - 輸入 & 輸出
- C - 檔案I/O (檔案處理)
- C預處理器
- C - 預處理器
- C - 預處理指令
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static關鍵字
- C - 隨機數生成
- C - 命令列引數
- C程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C語言中的函式指標
什麼是C語言中的函式指標?
在C語言中,指標是一個儲存另一個變數地址的變數。類似地,儲存函式地址的變數稱為函式指標或指向函式的指標。當您想要動態呼叫函式時,函式指標很有用。C語言中回撥函式的機制依賴於函式指標。
函式指標像普通指標一樣指向程式碼。在函式指標中,可以使用函式名獲取函式的地址。函式也可以作為引數傳遞,也可以從函式中返回。
宣告函式指標
您應該有一個函式,您將要宣告其函式指標。要在C語言中宣告函式指標,請編寫一個宣告語句,其中包含返回型別、指標名稱以及它指向的函式的引數型別。
宣告語法
以下是宣告函式指標的語法
function_return_type(*Pointer_name)(function argument list)
示例
這是一個簡單的C語言中的hello()函式:
void hello(){ printf("Hello World"); }
我們如下宣告指向此函式的指標:
void (*ptr)() = &hello;
現在,我們可以使用此函式指標“(*ptr)();”來呼叫該函式。
函式指標示例
以下示例演示瞭如何宣告和使用函式指標來呼叫函式。
#include <stdio.h> // Defining a function void hello() { printf("Hello World"); } // The main code int main() { // Declaring a function pointer void (*ptr)() = &hello; // Calling function using the // function poiter (*ptr)(); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Hello World
注意:與作為資料指標的普通指標不同,函式指標指向程式碼。我們可以使用函式名作為其地址(如陣列的情況)。因此,指向函式hello()的指標也可以如下宣告:
void (*ptr)() = hello;
帶引數的函式指標
也可以為具有引數的函式宣告函式指標。在宣告函式時,需要提供特定資料型別作為引數列表。
理解帶引數的函式指標
假設我們有一個名為addition()的函式,它有兩個引數:
int addition (int a, int b){ return a + b; }
要為上述函式宣告函式指標,我們使用兩個引數:
int (*ptr)(int, int) = addition;
然後,我們可以透過傳遞所需的引數來透過其指標呼叫該函式:
int z = (*ptr)(x, y);
請嘗試以下完整程式碼:
帶引數的函式指標示例
這是完整程式碼。它顯示瞭如何透過其指標呼叫函式:
#include <stdio.h> int addition (int a, int b){ return a + b; } int main(){ int (*ptr)(int, int) = addition; int x = 10, y = 20; int z = (*ptr)(x, y); printf("Addition of x: %d and y: %d = %d", x, y, z); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Addition of x: 10 and y: 20 = 30
指向具有指標引數的函式的指標
當主機函式本身具有指標引數時,我們也可以宣告函式指標。讓我們看看這個例子:
理解指向具有指標引數的函式的指標
我們有一個swap()函式,它使用它們的指標交換“x”和“y”的值:
void swap(int *a, int *b){ int c; c = *a; *a = *b; *b = c; }
按照宣告函式指標的語法,可以宣告如下:
void (*ptr)(int *, int *) = swap;
要交換“x”和“y”的值,請將它們的指標傳遞給上述函式指標:
(*ptr)(&x, &y);
指向具有指標引數的函式的指標示例
這是此示例的完整程式碼:
#include <stdio.h> void swap(int *a, int *b){ int c; c = *a; *a = *b; *b = c; } int main(){ void (*ptr)(int *, int *) = swap; int x = 10, y = 20; printf("Values of x: %d and y: %d before swap\n", x, y); (*ptr)(&x, &y); printf("Values of x: %d and y: %d after swap", x, y); return 0; }
輸出
Values of x: 10 and y: 20 before swap Values of x: 20 and y: 10 after swap
函式指標陣列
您還可以根據以下語法宣告函式指標陣列
type (*ptr[])(args) = {fun1, fun2, ...};
函式指標陣列示例
我們可以使用透過指標動態呼叫函式的屬性,而不是使用if-else或switch-case語句。請檢視以下示例:
#include <stdio.h> float add(int a, int b){ return a + b; } float subtract(int a, int b){ return a - b; } float multiply(int a, int b){ return a * b; } float divide(int a, int b){ return a / b; } int main(){ float (*ptr[])(int, int) = {add, subtract, multiply, divide}; int a = 15, b = 10; // 1 for addition, 2 for subtraction // 3 for multiplication, 4 for division int op = 3; if (op > 5) return 0; printf("Result: %.2f", (*ptr[op-1])(a, b)); return 0; }
輸出
執行程式碼並檢查其輸出:
Result: 150.00
將op變數的值更改為1、2或4以獲取其他函式的結果。