天天看點

2015.08.25函數指針

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 test(p vp, int &a, int &b)

vp(a, b);

p  vp = cube;

vp(x, y);//在主函數中使用函數指針

test(vp, x, y);//函數指針作為函數

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的函數

轉自:http://blog.csdn.net/qq_31810357