指針變量可以指向任何類型的數據,也可以指向一個函數。每個函數在內存中都占用一段存儲單元,這段存儲單元的首地址稱為函數的入口地址,指向這個函數入口地址的指針稱為函數指針。
1、函數指針基本用法:
int max(int a, int b) { return a > b ? a : b; } int (*p) (int , int) = max; int x = 20, y = 30; int z = p(x, y);
首先定義了一個max函數,函數接受兩個int類型的參數并返回其中的最大值。
int (*p) (int , int) = max;
這行代碼中定義了一個函數指針p,在定義函數指針時必須指明函數指針所指向函數的返回值和參數列表。代碼中的函數指針p所指向的函數的返回值為int類型,參數列表為兩個int類型的參數,這與max函數的返回值和參數列表一致,因此可以用函數max初始化函數指針p。
注:函數名等價于函數的入口地址
2、函數指針的定義和初始化
- 括號不能少
在定義時 * p 必須用括號括起來,如果去掉括號代碼變為
int *p (int, int) // p 是函數而非指針
上面代碼中的p不是一個函數指針,而是一個函數名。代碼聲明了一個函數p,函數返回值類型為int* 類型,并且包括兩個int類型的參數。
- 在對函數指針初始化或者賦值的過程中,一定要保證函數的參數個數和類型與函數指針的定義相匹配。
3、函數指針實現簡單的四則運算
代碼如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> int add(int a, int b) { return a + b; } int minus(int a, int b) { return a - b; } int multi(int a, int b) { return a * b; } int divide(int a, int b) { return a / b; } int calculator(int a, int b, int(*Func)(int, int)) { return Func(a, b); } int main() { int a = 40, b = 20; int res1 = calculator(a, b, add); printf("a + b = %d ", res1); int res2 = calculator(a, b, minus); printf("a - b = %d ", res2); int res3 = calculator(a, b, multi); printf("a * b = %d ", res3); int res4 = calculator(a, b, divide); printf("a / b = %d ", res4); system("pause"); return 0; }
運行結果:

4、typedef關鍵字的用法
使用typedef關鍵字對函數指針類型重定義,并在定義函數指針時使用通過typedef重定義后的類型名。
typedef int (*pFunc) (int, int); int calculator( int a, int b, pFunc func );