函數指針是指向函數的指針變量。因而函數指針本身首先應是指針變量,只不過該指針變量指向函數。正如指針變量可指向整型變量、字符型、數組一樣,這裏是指向函數。C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量後,可用該指針變量調用函數,就如同使用指針變量可引用其他類型變量一樣。函數指針有兩個用途:調用函數和做函數的參數。
函數指針的聲明方法爲:
返回值類型 (*指針變量名)([形參列表]);
注:返回值類型說明函數的返回類型,“(*指針變量名)”中的括號不能省,括號改變了運算符的優先級。若省略整體則成爲一個函數說明,說明了一個函數的數據類型是指針的函數,後面的“形參列表”表示指針變量指向的函數所帶的參數列表。
定義函數指針類型:
typedef 返回值類型 (*指針類型名)([形參列表]);
指針函數是指返回值是指針的函數,本質上是一個函數。我們知道函數都有返回值,只不過指針函數返回類型是某一類型的指針。
指針數組:
函數返回值類型 (*數組名[])([形參列表])
複雜函數指針的解析:
1) float (*(*fp)(int,int,float))(int);
解析:float X(int)其中X是一個函數,有一個整型參數,返回值是一個浮點數。
X=*(*fp)(int,int,float);
fp是一個函數指針,它有三個參數,前兩個是整型,最後一個是浮點型。其返回值是一個指針,是一個指向函數的指針(函數指針)。這個函數指針所指向的函數的原型是隻有一個整型參數,返回值是一個浮點數。
2) int (*(*fp())[10])();
解析:fp是一個函數,他沒有參數,返回值是一個指針;
X= (*fp());
int (*X[10])();
X是一個數組,其有10個元素,每個元素都是一個函數指針,這個函數指針所代表的函數原型是一個沒有參數,返回值是整型的函數。
綜合起來就是:fp是一個函數,他沒有參數,返回值時一個指向數據的指針,這個數組有10個元素,每個元素都是一個函數指針,這個函數指針所代表的函數圓型是一個沒有參數,返回值是整型的函數。
3) typedef double (*(*(*fp)())[10])();
解析:fp是一個函數指針;它不帶參數;返回值是一個指針。
X=(*(*fp)())
typedef double (*X[10])()
X是一個數組,他有10個元素,它的元素都是函數指針,這個函數指針所指向的函數原型是一個沒有參數,返回值爲double類型的函數。
綜合起來就是:fp是一個新定義的數據類型,它是一個函數指針,這個函數指針所指向的函數原型是不帶參數,返回值是一個指向數組的指針。這個數組有10個元素,其元素類型是一個函數指針,這個函數指針所指向的函數原型是一個沒有參數,返回值爲double類型的函數。
#include <stdio.h>
#include <iostream>
using namespace std;
int(*func_ptr)(int, int);
typedef int(*func_ptr_t)(int, int);
typedef int(*func_ptr_array_t[])(int, int);
int Max(int a, int b)
{
return a > b ? a : b;
}
int Min(int a, int b)
{
return a < b ? a : b;
}
int main()
{
// 函數指針
func_ptr = Max;
int result = func_ptr(1, 2);
cout << result << endl;
// 定義函數指針類型
func_ptr_t ppt = Max;
result = ppt(2, 3);
cout << result << endl;
// 函數指針數組
func_ptr_array_t ptr_array = { Max, Min };
int result_max = ptr_array[0](5, 6);
int result_min = ptr_array[1](6, 5);
cout << "max:" << result_max << ";" << "min:" << result_min << endl;
// 函數指針數組
func_ptr_t* ptr_func_array = new func_ptr_t[2];
ptr_func_array[0] = Max;
ptr_func_array[1] = Min;
result_max = ptr_array[0](8, 9);
result_min = ptr_array[1](9, 8);
cout << "max:" << result_max << ";" << "min:" << result_min << endl;
}