函數指針

函數指針是指向函數的指針變量。因而函數指針本身首先應是指針變量,只不過該指針變量指向函數。正如指針變量可指向整型變量、字符型、數組一樣,這裏是指向函數。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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章