2015 11 04 函數指針

1、函數指針: 指向函數的指針就叫函數指針,由於函數名以存儲名就是函數的首地址,即函數指針時指向函數名的指針
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的函數

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