2、格式: 指針類型修飾符 * 指針變量名 = 初始值;
3、函數指針確定的步驟:
//第一步:將函數名去掉,用小括號星(*)替代
// void (*)(); int (*)(int a,int b);
//第二步:若有參數,將參數名去掉,只保留參數類型;
// void (*)(); int (*)(int ,int );
4、 //定義函數指針變量需要注意的內容:1:確定函數指針的類型,2.指針變量名不能與函數重名,3.有參數的指針變量只寫參數類型
1.一個函數的指針,必須確保該函數被定義且分配了內存,否則將指向空地址,這是指針的大忌。
2.函數指針的使用條件:參數、返回值都吻合‘
3.函數指針沒有++或--的運算
4.函數指針作爲參數的最好的例子就是回調函數
5.函數指針的使用
例:
void (*p)(int &, int &);
void cube(int &x, int &y)
{
x = x * x * x;
y = y * y * y;
}
void Test(void (*p)(int &, int &), int &a, int &b)
{
p(a, b);
cout<<a<<' '<<b<<endl;
}
int main()
{
int x = 2, y = 3;
p = cube;
p(x, y);//在主函數中使用函數指針
cout<<x<<' '<<y<<endl;
Test(p, x, y);//函數指針作爲函數
return 0;
}
輸出:
8 27
512 19683
用typedef可以簡化函數指針的使用。
例:
typedef void (*p)(int &, int &);
void cube(int &x, int &y)
{
x = x * x * x;
y = y * y * y;
}
void Test(p vp, int &a, int &b)
{
vp(a, b);
cout<<a<<' '<<b<<endl;
}
int main()
{
int x = 2, y = 3;
p vp = cube;
vp(x, y);//在主函數中使用函數指針
cout<<x<<' '<<y<<endl;
Test(vp, x, y);//函數指針作爲函數
return 0;
}
輸出:
8 27
512 19683
6.對於成員函數指針,注意以下幾點
1)要在特定類的對象中調用成員函數指針
2)儘量利用typedef簡化成員函數指針
3)儘量不用成員函數指針
7.數組名是數組第一個元素的指針。同理,函數名也是指向函數第一條指令的常量指針
程序編譯後,每個函數都有個首地址,也就是函數第一條指令的地址。
如果用一個指針來保存這個地址,那麼這個指針就是函數指針,該指針可以看作是函數名。
因此我們可以通過函數指針調用函數
8.int* func(int);
聲明瞭一個帶有整型參數的函數func,並返回一個整型的指針
聲明瞭一個函數,返回一個指針
int (*func)(int);
聲明一個int型的指針func,它指向一個函數,這個函數帶有一個int型的參數,並返回int型的值。
聲明一個指針,返回一個函數
9.使用函數指針,便於用戶選擇調用不同名字但是又類型和參數相同的函數
10.函數指針數組
void (*p[5])(int, int);
聲明瞭一個有5個元素的數組指針,每個指針指向的是帶有兩個int參數且返回void的函數