C 函式指標

2021-09-07 04:03:43 字數 3368 閱讀 8626

函式指標是指向函式的指標變數。 因而「函式指標」本身首先應是指標變數,只不過該指標變數指向函式。這正如用指標變數可指向整型變數、字元型、陣列一樣,這裡是指向函式。如前所述,c在編譯時,每乙個函式都有乙個入口位址,該入口位址就是函式指標所指向的位址。有了指向函式的指標變數後,可用該指標變數呼叫函式,就如同用指標變數可引用其他型別變數一樣,在這些概念上是大體一致的。函式指標有兩個用途:呼叫函式和做函式的引數。

1方法

函式指標的宣告方法為:

返回值型別 ( *指標變數名) ([形參列表]);

注1:「返回值型別」說明函式的返回型別,「(指標變數名 )」中的括號不能省,括號改變了運算子的優先順序。若省略整體則成為乙個函式說明,說明了乙個返回的資料型別是指標的函式,後面的「形參列表」表示指標變數指向的函式所帶的引數列表。例如:

int func(int x); /*

宣告乙個函式

*/int (*f) (int x); /*

宣告乙個函式指標

*/f=func; /*

將func函式的首位址賦給指標f

*/f = &func;

賦值時函式func不帶括號,也不帶引數,由於func代表函式的首位址,因此經過賦值以後,指標f就指向函式func(x)的**的首位址。

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

下面的程式說明了函式指標呼叫函式的方法:

例一、

#includeint max(int x,int y)

intmain()

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

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

應該是這樣的:

1.定義函式指標型別:

typedef

int (*fun_ptr)(int,int);2

.宣告變數,賦值:

fun_ptr max_func=max;

也就是說,賦給函式指標的函式應該和函式指標所指的函式原型是一致的。

例二、

#includevoid

filefunc()

void

editfunc()

void

main()

2對比區別

指標函式和函式指標的區別:

1,這兩個概念都是簡稱,指標函式是指返回值是指標的函式,即本質是乙個函式。我們知道函式都有返回型別(如果不返回值,則為無值型),只不過指標函式返回型別是某一型別的指標。

其定義格式如下所示:

返回型別識別符號*函式名稱(形式參數列)

返回型別可以是任何基本型別和復合型別。返回指標的函式的用途十分廣泛。事實上,每乙個函式,即使它不帶有返回某種型別的指標,它本身都有乙個入口位址,該位址相當於乙個指標。比如函式返回乙個整型值,實際上也相當於返回乙個指標變數的值,不過這時的變數是函式本身而已,而整個函式相當於乙個「變數」。例如下面乙個返回指標函式的例子:

//

指標函式是指返回值是指標的函式,即本質是乙個函式:

#includeusing

namespace

std;

intmain()

,, };//

定義成績陣列,第一維可以為變數

float*pf=null;//

定義乙個指標時一定要初始化

inti,m;

cout

<<"

請輸入您想查詢的學生的序號:";

cin>>m;

pf=find(score,m);//

返回為一維陣列指標,指向乙個學生成績

for(i=0;i<4;i++)

cout

<<*(pf+i)<<""

; cout

}float *find(float(*p)[4

],intm)

學生學號從0號算起,函式find()被定義為指標函式,其形參pointer是指標指向包含4個元素的一維陣列的指標變數。pf是乙個指標變數,它指向浮點型變數。main()函式中呼叫find()函式,將score陣列的首位址傳給pointer.

3指標陣列

定義關於函式指標陣列的定義方法,有兩種:一種是標準的方法;一種是矇騙法。

第一種,標準方法:

第二種,矇騙法:

函式名相當於乙個指向其函式入口指標常量。 那麼既然函式名是乙個指標常量,那麼就可以對其進行一些相應的處理,如強制型別轉換。

那麼我們就可以把這個位址放在乙個整形指標陣列中,然後作為函式指標呼叫即可。

完整例子:

#include int add1(int a1,int

b1);

int add2(int a2,int

b2);

int main(void)

int add1(int a1,int

b1)

int add2(int a2,int

b2)

賦值

為函式指標陣列賦值有兩種方式:靜態定義和動態賦值。

1. 靜態定義

在定義函式指標陣列的時候,已經確定了每個成員所對應的函式。例如:

1void(*array)(void)=;

從根本上講函式指標陣列依然是陣列,所以和陣列的定義類似,由於是靜態賦值,[ ]裡面的數字可以

省略。這個函式指標陣列的成員有三個。

1array[

1]();//

執行run函式

2. 動態賦值

也可以先定義乙個函式指標陣列,在需要的時候為其賦值。為了還原其本來面目,我們先對這個執行特定型別的函式指標進行型別重定義,然後再用這個新資料型別來定義陣列。如下:

typedef void(*ifunc)(void);//

此型別的函式指標指向的是無參、無返回值的函式。

funcint array[32];//

定義乙個函式指標陣列,其每個成員為intfun型別的函式指標

array[10]=int_timer0;//

為其賦值

array[10]();//

呼叫函式指標陣列的第11個成員指向的函式

C 指標函式和函式指標

1 指標函式 1 基本概念 指標函式 顧名思義就是帶有指標的函式,即其本質是乙個函式,只不過這種函式返回的是乙個對應型別的位址。2 定義式 type func type type 如 int max int x,int y 3 例子詳解 cpp view plain copy 1.include 2...

c 指標函式和函式指標

函式指標與指標函式 1 函式指標 形式 返回型別 函式名 參數列 一種特殊的指標,它指向函式的入口 定義乙個函式指標p,只能指向返回值為int,形參為兩個int的函式 輸出結果 include stdafx.h include using namespace std int p int,int in...

C 函式指標與指標函式

函式指標 函式名本身代表著函式的位址,因此給函數指標賦值使可以不用加 符號 加也可以!void func int 定義乙個函式 void pf int 定義乙個函式指標 pf func 給函式指標賦值 int f x,y 其中x,y是形式引數,f是函式名,呼叫後返回乙個指向整型資料的位址指標。f x...