函式指標的主要用途總結

2021-10-24 03:12:17 字數 3812 閱讀 1613

首先我們來宣告乙個函式。

int

max_int

(int a,

int b)

把函式名替換成指標表示式是建立指向函式指標最簡單的方式:

int (*pfun)(int a, int b); //宣告函式指標,此時函式指標沒有指向任何函式

這時,我們就已經完成了乙個最簡單的函式指標宣告,其意義是:生命了乙個函式指標,其指向的函式返回乙個int值,帶有兩個int型引數。

接下來我們對函式指標進行初始化:

pfun = max_int; //使函式指標指向max_int函式

這樣就完成了函式指標的初始化。接下來,我麼就可以通過此函式指標引用此函式。

int max;

int m =5;

int n =8;

max =

(*pfun)

(m,n)

;//使用函式指標引用max_int函式

max =

pfun

(m,n)

;//與上一句效果完全相同

printf

(「the max value is %d\n」, max)

;//print 『8』

ps:第四和第五句效果完全相同,編譯器都認識。

1)使用typedef宣告函式指標。

我們可以使用typedef來宣告函式,以使**的可讀性更強。

typedef

bool

(*pcopysdmmc2mem)

(int

,unsigned

int,

unsigned

short

,unsigned

int*

,bool

);

通過之前的介紹,我們可以知道,此函式指標可以指向「返回bool型,帶int, unsigned int, unsigned short, unsigned int*, bool型引數」 的函式。

藉此宣告,我們可以像宣告變數那樣同時建立多個函式指標。

pcopysdmmc2mem pf1, pf2;
2)使用define來定義函式指標

#define copysdmmctomem(z,a,b,c,e)(((bool(*)(int, unsigned int, unsigned short, unsigned int*, bool))(*((unsigned int *)0xd0037f98)))(z,a,b,c,e))
效果同上,但指定了指向函式的入口位址(0xd0037f98)

1)將函式作為引數傳遞給函式

相信大家中學的時候都學過積分。不知道還記不記得積分最原始的計算方法。

對,沒錯,無限細分,求面積。好的。我們接下來就給大家乙個應用函式指標有關積分計算的例子。

直接貼出**。

#include

//calculate用於計算積分。一共三個引數。第乙個為函式指標func,指向待積分函式。二三引數為積分上下限

double

calculate

(double

(*func)

(double x)

,double a,

double b)

return sum;

}double

func_1

(double x)

double

func_2

(double x)

void

main()

通過函式指標,我們可以在函式中使用別的函式作為引數。此程式可以完成對不同函式的積分。

2)引用不在**段中的函式

此功能在嵌入式系統中經常使用。我們知道,我們寫的使用者程式的code是存放在**段中的,在嵌入式系統中,一般情況下是存放在flash中的。什麼叫不在**段中的函式呢?很多微控制器在出廠前會將一些功能函式(系統函式)固化在rom中(類似於pc機中的bios),如flash擦寫功能,flash copy功能。而我們寫的**是不認識這些函式的,不能直接使用函式名呼叫。所以,當我們想在使用者程式中呼叫這些系統函式時,就只能使用函式指標的方式,通過將系統函式的入口位址傳給函式指標,來達到呼叫rom中程式的目的。這些系統函式一般都會在官方手冊中給出功能,返回值型別和引數列表。

從上我們可以分析出,此系統函式的入口位址為0xd0037f98。返回bool型,帶有int, unsigned int, unsigned short, unsigned int*, bool型五個引數。實際使用時,我們可以如下呼叫:

// 實際使用時

pcopysdmmc2mem p1 =

(pcopysdmmc2mem)

0xd0037f98;p1

(x, x, x, x, x)

;

傳入五個合適的引數即可。

函式指標說完了。我們接下來來看看函式指標陣列。

多了倆字,"陣列"前面四個字還一樣。那是不是就是有乙個陣列,用它來盛放函式指標。嗯,沒錯,就是這樣。

有了剛才的基礎,我直接給出例子。

void

(*funcpointerarray[3]

)(double x)

;//函式指標陣列

void

(*funcpointer)

(double x)

;//函式指標

兩個放在一起對比,函式指標陣列無非就像陣列宣告一樣,在後面加了而已。僅此而已。

那它怎麼用呢?

voidf1(

double x)

voidf2(

double x)

voidf3(

double x)

//來三個具體的函式,f1,f2,f3.

void

(*funcpointerarray[3]

)(double x)

;funcpointerarray[0]

=f1;

funcpointerarray[1]

=f2;

funcpointerarray[2]

=f3;

funcpointerarray[0]

(「2.333333」)

;funcpointerarray[1]

(「6.666666」)

;

簡直就和普通的陣列一模一樣。沒錯,無非他儲存的是函式指標而已。

最後,貼乙個用函式指標陣列的具體的應用的例子。

#include

void

additem

(char

*name)

void

deleteitem

(char

*name)

void

finditem

(char

*name)

void

updateitem

(char

*name)

void

main()

在上述的例子中,用函式指標陣列代替了大量的switch case 直接通過傳入的num值來呼叫不同的函式。

好了,相信講到這裡,大家應該清楚的明白什麼是函式指標和函式指標陣列了。

參考文章:

MSSQL escape的主要用途

title 生成測試資料 author wufeng4552 date 2009 09 22 09 27 36 declare t table test nvarchar 5 insert t select n 11 22 union all select n 11 33 union all sel...

python主要用途 python的主要用途是什麼

python主要的五大應用介紹 一 web開發 python的誕生歷史比web還要早,由於python是一種解釋型的指令碼語言,開發效率高,所以非常適合用來做web開發。python有上百種web開發框架,有很多成熟的模板技術,選擇python開發web應用,不但開發效率高,而且執行速度快。二 網路...

Java泛型的主要用途

1.泛型的主要用途就是代替各種型別,作為乙個籠統的整體型別代替,也就是代替引數,不論是傳入引數還是返回引數。都可以用泛型來代替。如dao操作類的增刪改查操作,因為傳入引數的型別不同,但基本都是相同介面,所以就可以只寫乙個dao操作類的增刪該查方法,其傳入引數用泛型代替。如 public intupd...