函式指標例項

2021-07-30 18:10:06 字數 4831 閱讀 6636

1.      定義

每乙個函式都占用一段記憶體單元,它們有乙個起始位址,指向函式入口位址的指標稱為函式指標。

2.     語法

指向函式的指標變數的一般定義形式為:

資料型別 (*指標變數名)(參數列);

3.     說明

1) 函式指標的定義形式中的資料型別是指函式的返回值的型別。

2) 區分下面兩個語句:

int (*p)(int a, int b); //p是乙個指向函式的指標變數,所指函式的返回值型別為整型

int *p(int a, int b); //p是函式名,此函式的返回值型別為整型指標

3) 指向函式的指標變數不是固定指向哪乙個函式的,而只是表示定義了乙個這樣型別的變數,它是專門用來存放函式的入口位址的;在程式中把哪乙個函式的位址賦給它,它就指向哪乙個函式。

4) 在給函式指標變數賦值時,只需給出函式名,而不必給出引數。

如函式max的原型為:int max(int x, int y); 指標p的定義為:int (*p)(int a, int b); 則p = max;的作用是將函式max的入口位址賦給指標變數p。這時,p就是指向函式max的指標變數,也就是p和max都指向函式的開頭。

5) 在乙個程式中,指標變數p可以先後指向不同的函式,但乙個函式不能賦給乙個不一致的函式指標(即不能讓乙個函式指標指向與其型別不一致的函式)。

如有如下的函式:int fn1(int x, int y); int fn2(int x);

定義如下的函式指標:int (*p1)(int a, int b); int (*p2)(int a);

則p1 = fn1; //正確

p2 = fn2; //正確

p1 = fn2; //產生編譯錯誤

6) 定義了乙個函式指標並讓它指向了乙個函式後,對函式的呼叫可以通過函式名呼叫,也可以通過函式指標呼叫(即用指向函式的指標變數呼叫)。

如語句:c = (*p)(a, b); //表示呼叫由p指向的函式(max),實參為a,b,函式呼叫結束後得到的函式值賦給c。

7) 函式指標只能指向函式的入口處,而不可能指向函式中間的某一條指令。不能用*(p+1)來表示函式的下一條指令。

8) 函式指標變數常用的用途之一是把指標作為引數傳遞到其他函式。

#include

using namespace std;  

#include

int max(int x, int y); //求最大數  

int min(int x, int y); //求最小數  

int add(int x, int y); //求和  

void process(int i, int j, int (*p)(int a, int b)); //應用函式指標  

int main()  

int max(int x, int y)  

int min(int x, int y)  

int add(int x, int y)  

void process(int i, int j, int (*p)(int a, int b))  

int funca(int a,int b)

int funcb(int* a,int *b)

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

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

[cpp] view plain copy

#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;

程式正確,更加證明了

[cpp] view plain copy

typedef int(func1)(int);

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

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

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

[cpp] view plain copy

typedef int (*func1)(int);

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

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

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

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

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

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

[cpp] view plain copy

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

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

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

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

[cpp] view plain copy

void (*fpv)(int,int);

fvp = inc // fvp = &inc

函式型別與函式指標變數

如何定義函式型別呢

[cpp] view plain copy

typedef void (ft)(int,int);

申明的函式型別如何使用呢?

首先可以用來申明函式:

ft x,y等價於:

void x(int,int);

void y(int,int);

請看如下的示例:

[cpp] view plain copy

#include

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

ft x,y;

main()

int x(int* a,int*b)

int y(int*a,int* b)

上面的程式輸出3和6

[cpp] view plain copy

#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*)。

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

[cpp] view plain copy

#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)使用乙個函式做為形式引數,呼叫時傳遞乙個函式名字給他就可以,也可以傳遞乙個函式常量指標。模擬於使用指標常量或者陣列作函式書引數的時候

[cpp] view plain copy

#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)

函式指標例項2

c語言函式指標的定義形式 返回型別 函式指標名稱 引數型別,引數型別,引數型別,c 函式指標的定義形式 返回型別 類名稱 函式成員名稱 引數型別,引數型別,引數型別,以下 編譯環境 codeblocks with gcc in win 7 c語言函式指標使用舉例 複製 include include...

函式指標例項二

include include typedef int fp calc int,int 定義乙個函式指標型別 int add int a,int b int sub int a,int b int mul int a,int b int div int a,int b typedef int fp ...

指標函式和函式指標 附例項詳解

今天遇到指標函式和函式指標的問題,就直接把它徹底地分析了一遍,總結如下 指標函式與函式指標表示方法的不同,千萬不要混淆。最簡單的辨別方式就是看函式名前面的指標 號有沒有被括號 包含,如果被包含就是函式指標,反之則是指標函式。主要的區別是乙個是指標變數,乙個是函式。在使用是必要要搞清楚才能正確使用。1...