C 中函式指標的使用

2021-06-08 22:09:25 字數 3570 閱讀 1809

在c/c++中存在著函式指標,即指向函式的指標。我目前已知的兩種使用方法是:

#include #include typedef int* pinnt;

#define pp int*

int funca(int a,int b);

int funcb(int* a,int *b);

int main(int argc, char *argv)

int funca(int a,int b)

int funcb(int* a,int *b)

這裡int (*func)(int,int)定義了乙個函式指標變數,可以接受函式名或者函式名的指標(這裡我還沒有很清楚)。

然後我在csdn上面找到了乙個例子,據說是華為的面試題目,**如下,這時程式正常輸出值為110。

#include int   inc(int   a) 

int multi(int*a,int*b,int*c)

typedef int(func1)(int);

typedef int(func2)(int*,int*,int*);

void show(func2 fun,int arg1, int*arg2)

main()

一開始我沒有理解這個用法的時候,以為這裡使用的方法與方法一相同,故直接寫成

typedef   int(func1)(int); 

typedef int(func2)(int*,int*,int*);

void show(func2 fun,int arg1, int*arg2)

這時候,編譯器給出的提示是:

1>d:\vctest\test4\test4\test4.c(17) : error c2513: 'int (int)' : no variable declared before '=' 

func1 = inc這個語句的左邊沒有變數被申明,這個錯誤提示說明利一點:func是一種型別而不是乙個變數。做出如下更正:

func1  *p = inc;

程式正確,更加證明了

typedef   int(func1)(int); 

typedef int(func2)(int*,int*,int*);

語句定義了兩個自己的資料型別func1和func2,這兩個型別申明的變數用儲存函式指標

也可以採用下面的方式進行定義:

typedef   int (*func1)(int); 

typedef int (func2)(int*,int*,int*);

void show(func2 fun,int arg1, int*arg2)

以上例子,涉及到的概念有函式指標,函式型別和函式指標變數

函式指標變數有兩種實現方法:

1. 先申明函式指標型別,在用函式指標型別申明函式指標變數

//typedef void funtype(int);  -- funtype:同樣是乙個函式指標型別。

typedef void (*pf)(int,int);

//使用函式指標型別申明的變數就是函式指標變數

//pf a = &inc//pf a = inc

2. 直接定義乙個函式指標變數

void (*fpv)(int,int);

fvp = inc // fvp = &inc

函式型別與函式指標變數

如何定義函式型別呢

typedef void (ft)(int,int);
申明的函式型別如何使用呢?

首先可以用來申明函式:

ft x,y等價於:

void x(int,int);

void y(int,int);

請看如下的示例:

#include typedef int (ft)(int*,int*);

ft x,y;

main()

int x(int* a,int*b)

int y(int*a,int* b)

上面的程式輸出3和6

#include typedef int (ft)(int*,int*);

ft x,y,*z,u;

main()

int x(int* a,int*b)

int y(int*a,int* b)

上面的例子中ft *z其實是申明了乙個指向函式的函式指標變數,類似於int(*z)(int*,int*)。

最後再來看下那個困擾了我很久的例子吧:

#include int   inc(int   a) 

int multi(int*a,int*b,int*c)

typedef int (*func1)(int);

typedef int (func2)(int*,int*,int*);

typedef int (func3)(int*,int*,int*);

void show(func2 *fun,int arg1, int*arg2)

//void show(func2 fun,int arg1, int*arg2)//這裡做這樣的宣告也一樣是對的

main()

最讓我疑惑的是

void   show(func2 *fun,int   arg1,   int*arg2)

//void   show(func2 fun,int   arg1,   int*arg2)//這裡做這樣的宣告也一樣是對的

這兩種宣告方式都是對的,採用void   show(func2 fun,int   arg1,   int*arg2)//這裡做這樣的宣告也一樣是對的這種方式宣告, show(multi,1,&a);呼叫時正確的,

而前面的**中,我也說過//u = x;//這裡出錯了這裡u是乙個函式名稱,是乙個指標常量,類似於陣列名稱,是不能夠被賦值的, 這個問題困擾我很久啊,仔細考慮之後,我個人的觀點是:void   show(func2 fun,int   arg1,   int*arg2)使用乙個函式做為形式引數,呼叫時傳遞乙個函式名字給他就可以,也可以傳遞乙個函式常量指標。模擬於使用指標常量或者陣列作函式書引數的時候

#include typedef void (ft)(int* const a);

ft z;

void main()

; int b = 5;

int *c = &b;

z(a);

//但是如果在這裡給a = c是不對的

}void z(int* const a)

關於C 中函式指標的使用

一 簡單的函式指標的應用。形式1 返回型別 函式名 參數列 char pfun int char glfun int a void main 第一行定義了乙個指標變數pfun。首先我們根據前面提到的 形式1 認識到它是乙個指向某種函式的指標,這種函式引數是乙個int型,返回值是char型別。只有第一...

c 函式指標的使用

關於c 中函式指標的使用 包含對typedef用法的討論 一 簡單的函式指標的應用。形式1 返回型別 函式名 參數列 char pfun int char glfun int a void main 第一行定義了乙個指標變數pfun。首先我們根據前面提到的 形式1 認識到它是乙個指向某種函式的指標,...

C 函式指標的使用

函式指標指向某種特定型別,函式的型別由其引數及返回型別共同決定,與函式名無關。舉例如下 int add int nleft,int nright 函式定義 該函式型別為int int,int 要想宣告乙個指向該類函式的指標,只需用指標替換函式名即可 int pf int,int 未初始化 則pf可指...