函數(shù)指針的定義
一個函數(shù)總是占用一段連續(xù)的內(nèi)存區(qū)域,函數(shù)名在表達式中有時也會被轉(zhuǎn)換為該函數(shù)所在內(nèi)存區(qū)域的首地址哮独,與數(shù)組名類似拳芙。
我們可以將這個函數(shù)的首地址賦值給一個指針變量察藐,使指針變量指向函數(shù)所在的內(nèi)存區(qū)域,然后通過指針變量就可以找到并調(diào)用該函數(shù)舟扎。這種指針就是函數(shù)指針分飞。
函數(shù)指針的定義形式
// returnType:函數(shù)返回值類型
// pointerName:指針名稱
// param list:函數(shù)的參數(shù)列表。參數(shù)可以同時指定類型和名稱浆竭,也可以只指定類型浸须,省略名稱。跟函數(shù)聲明類似
returnType(*pointerName)(param list);
函數(shù)指針的基本使用
// 定義基本函數(shù)
void message() {}
// 定義函數(shù)指針并初始化
void(*func_p)() = &message;
// 調(diào)用函數(shù)指針邦泄,與message()調(diào)用等價
func_p();
函數(shù)指針的應用實例
實例1:將函數(shù)指針作為形參來接受外部函數(shù)
#include <stdio.h>
int add(int num1, int num2) {
return num1 + num2;
}
int minus(int num1, int num2) {
return num1 - num2;
}
// 將函數(shù)指針直接定義到函數(shù)形參中删窒,類似java中的多態(tài)
// 可以將函數(shù)指針作為函數(shù)參數(shù)傳入
void showMsg(int(*c)(int, int), int a, int b) {
int r = c(a, b);
printf("calculate result: %d\n", r);
}
int main() {
showMsg(add, 10, 10); // 20
showMsg(minus, 30, 2); // 28
return 0;
}
實例2:利用函數(shù)指針實現(xiàn)回調(diào)函數(shù)
#include <stdio.h>
//模擬網(wǎng)絡請求回調(diào)
void requestNet(char *url, void(*callBack)(char *)) {
printf("request url: %s, request...\n", url);
//模擬網(wǎng)絡請求耗時
char *str = "response data: hello world!";
callBack(str);
}
//回調(diào)函數(shù)
void netCallBack(char *str) {
printf("net request callBack\n");
printf("callBack data: %s\n", str);
}
int main(void) {
char *url = "www.baidu.com";
requestNet(url, netCallBack);
return 0;
}
// 打印結(jié)果:
// request url: www.baidu.com, request...
// net request callBack
// callBack data: response data: hello world!