函式指標和函式指標型別
阿新 • • 發佈:2018-11-10
參考:https://blog.csdn.net/candyliuxj/article/details/6339414
函式指標
1. 定義
每一個函式都佔用一段記憶體單元,它們有一個起始地址,指向函式入口地址的指標稱為函式指標。
注意:函式指標的本質是一個指標變數,且指標指向的函式的入口地址
2. 語法
指向函式的指標變數的一般定義形式為:
資料型別 (*指標變數名) (引數表);
3. 說明
- 函式指標定義形式中的資料型別是指函式的返回值的型別。
- 區分下面兩個語句:
int (*p)(int a, int b); //p是一個指向函式的指標變數,函式返回型別為整型
int *p(int a, int b); //p是函式名,函式返回型別為整型指標
- 函式指標指向的變數不是固定的某一個函式的,只是定義了一個變數專門用來存放函式的入口地址的;在程式中把哪一個函式的地址賦給它,它就指向哪一個函式。
- 在給函式指標變數賦值時,只需給出函式名,而不必給出引數。
int max(int x, int y) { return x+y; }
void main()
{
//定義一個函式指標
int (*p)(int a, int b);
p = max; //正確
p = &max; //正確
//通過函式指標定義變數
p(1,2); //正確
(*p)(1,2); //同樣正確
}
- 在一個程式中,指標變數p可以先後指向不同的函式,但一個函式不能賦給一個不一致的函式指標(即不能讓一個函式指標指向與其型別不一致的函式)。
int fn1(int x, int y);
int fn2(int x);
//定義如下的函式指標:
int (*p1)(int a, int b); int (*p2)(int a);
p1 = fn1; //正確
p2 = fn2; //正確
p1 = fn2; //產生編譯錯誤
- 函式指標只能指向函式的入口處,而不可能指向函式中間的某一條指令。不能用*(p+1)來表示函式的下一條指令。
- 函式指標變數常用的用途之一是把指標作為引數傳遞到其他函式。
4. 舉例
原始碼:
#include <iostream>
#include <conio.h>
using namespace std;
int max(int x, int y); //求最大數
int min(int x, int y); //求最小數
int add(int x, int y); //求和
void process(int i, int j, int (*p)(int a, int b)); //應用函式指標
int main()
{
int x, y;
cin>>x>>y;
cout<<"Max is: ";
process(x, y, max);
cout<<"Min is: ";
process(x, y, min);
cout<<"Add is: ";
process(x, y, add);
getch();
return 0;
}
int max(int x, int y)
{
return x > y ? x : y;
}
int min(int x, int y)
{
return x > y ? y : x;
}
int add(int x, int y)
{
return x + y;
}
void process(int i, int j, int (*p)(int a, int b))
{
cout<<p(i, j)<<endl;
}
函式指標型別
通過typedef定義函式指標型別
int max(int x, int y)
{
return x > y ? x : y;
}
//定義函式指標型別
typedef int(*pFun)(int, int)
int main()
{
//通過函式指標型別定義函式指標
pFun fun = &max;
fun(1,2);
return 0;
}