古詩詞大全網 - 成語大全 - 函數指針定義

函數指針定義

函數指針:

函數指針是指向函數的指針變量。 因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組壹樣,這裏是指向函數。如前所述,C在編譯時,每壹個函數都有壹個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量後,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量壹樣,在這些概念上是大體壹致的。函數指針有兩個用途:調用函數和做函數的參數。

函數指針的聲明方法為:

返回值類型 ( * 指針變量名) ([形參列表]);

註1:“返回值類型”說明函數的返回類型,“(指針變量名 )”中的括號不能省,括號改變了運算符的優先級。若省略整體則成為壹個函數說明,說明了壹個返回的數據類型是指針的函數,後面的“形參列表”表示指針變量指向的函數所帶的參數列表。例如:

int func(int x); /* 聲明壹個函數 */

int (*f) (int x); /* 聲明壹個函數指針 */

f=func; /* 將func函數的首地址賦給指針f */

或者使用下面的方法將函數地址賦給函數指針:

f = &func;

賦值時函數func不帶括號,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。

註2:函數括號中的形參可有可無,視情況而定。

下面的程序說明了函數指針調用函數的方法:

例壹、

#include<stdio.h>

int max(int x,int y){return (x>y? x:y);}

int main()

{

int (*ptr)(int, int);

int a, b, c;

ptr = max;

scanf("%d%d", &a, &b);

c = (*ptr)(a,b);

printf("a=%d, b=%d, max=%d", a, b, c);

return 0;

}

ptr是指向函數的指針變量,所以可把函數max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以後就可以用ptr來調用該函數,實際上ptr和max都指向同壹個入口地址,不同就是ptr是壹個指針變量,不像函數名稱那樣是死的,它可以指向任何函數,就看妳想怎麽做了。在程序中把哪個函數的地址賦給它,它就指向哪個函數。而後用指針變量調用它,因此可以先後指向不同的函數。不過註意,指向函數的指針變量沒有++和--運算,用時要小心。

不過,在某些編譯器中這是不能通過的。這個例子的補充如下。

應該是這樣的:

1.定義函數指針類型:

typedef int (*fun_ptr)(int,int);

2.聲明變量,賦值:

fun_ptr max_func=max;

也就是說,賦給函數指針的函數應該和函數指針所指的函數原型是壹致的。

例二、

#include<stdio.h>

void FileFunc()

{

printf("FileFunc\n");

}

void EditFunc()

{

printf("EditFunc\n");

}

void main()

{

typedef void(*funcp)();

funcp pfun=FileFunc;

pfun();

pfun=EditFunc;

pfun();

}