在網(wǎng)上搜索函數(shù)指針,看到一個(gè)例子。開(kāi)始沒(méi)看懂,想放棄,可是轉(zhuǎn)念一想,這個(gè)用法遲早要弄懂的,現(xiàn)在多花點(diǎn)時(shí)間看懂它,好過(guò)以后碰到了要再花一倍時(shí)間來(lái)弄懂它。其實(shí)很多時(shí)候都是這樣,如果每次到難一點(diǎn)的內(nèi)容,總想著下次我再來(lái)解決它,那就永遠(yuǎn)也學(xué)不到東西。
后面那個(gè)例子加了注釋,是我對(duì)這種用法的理解,希望對(duì)新手有所幫助。
進(jìn)入正文:
代碼簡(jiǎn)化, 促進(jìn)跨平臺(tái)開(kāi)發(fā)的目的.
typedef 行為有點(diǎn)像 #define 宏,用其實(shí)際類型替代同義字。
不同點(diǎn):typedef 在編譯時(shí)被解釋,因此讓編譯器來(lái)應(yīng)付超越預(yù)處理器能力的文本替換。
用法一:
typedef int (*MYFUN)(int, int);
這種用法一般用在給函數(shù)定義別名的時(shí)候
上面的例子定義MYFUN 是一個(gè)函數(shù)指針, 函數(shù)類型是帶兩個(gè)int 參數(shù), 返回一個(gè)int
在分析這種形式的定義的時(shí)候可以用下面的方法:
先去掉typedef 和別名, 剩下的就是原變量的類型.
去掉typedef和MYFUN以后就剩:
int (*)(int, int)
用法二:
typedef給變量類型定義一個(gè)別名.
typedef struct{
int a;
int b;
}MY_TYPE;
這里把一個(gè)未命名結(jié)構(gòu)直接取了一個(gè)叫MY_TYPE的別名, 這樣如果你想定義結(jié)構(gòu)的實(shí)例的時(shí)候就可以這樣:
MY_TYPE tmp;
第二種用法:typedef 原變量類型 別名
簡(jiǎn)單的函數(shù)指針的用法
//形式1:返回類型(*函數(shù)名)(參數(shù)表)
char(*pFun)(int);
//typedef char(*pFun)(int) //跟上一行功能等同
/*typedef的功能是定義新的類型。第一句就是定義了一種PTRFUN的類型,并定義這種類型為指向某種函數(shù)的指針,這種函數(shù)以一個(gè)int為參數(shù)并返回char類型。*/
char glFun(int a){return;}
void main()
{
pFun =glFun;
(*pFun)(2);
}
第一行定義了一個(gè)指針變量pFun.它是一個(gè)指向某種函數(shù)的指針,這種函數(shù)參數(shù)是一個(gè)int類型,返回值是char類型。只有第一句我們還無(wú)法使用這個(gè)指針,因?yàn)槲覀冞€未對(duì)它進(jìn)行賦值。
第二行定義了一個(gè)函數(shù)glFun().該函數(shù)正好是一個(gè)以int為參數(shù)返回char的函數(shù)。我們要從指針的層次上理解函數(shù)-函數(shù)的函數(shù)名實(shí)際上就是一個(gè)指針,函數(shù)名指向該函數(shù)的代碼在內(nèi)存中的首地址。
下面是一個(gè)例子:
//#include<iostream.h>#include<stdio.h>typedef int (*FP_CALC)(int, int);//注意這里不是函數(shù)聲明而是函數(shù)定義,它是一個(gè)地址,你可以直接輸出add看看int add(int a, int b){return a + b;}int sub(int a, int b){return a - b;}int mul(int a, int b){return a * b;}int div(int a, int b){return b? a/b : -1;}//定義一個(gè)函數(shù),參數(shù)為op,返回一個(gè)指針。該指針類型為 擁有兩個(gè)int參數(shù)、//返回類型為int 的函數(shù)指針。它的作用是根據(jù)操作符返回相應(yīng)函數(shù)的地址FP_CALC calc_func(char op){switch (op){case '+': return add;//返回函數(shù)的地址case '-': return sub;case '*': return mul;case '/': return div;default:return NULL;}return NULL;}//s_calc_func為函數(shù),它的參數(shù)是 op,//返回值為一個(gè)擁有 兩個(gè)int參數(shù)、返回類型為int 的函數(shù)指針int (*s_calc_func(char op)) (int, int){return calc_func(op);}//最終用戶直接調(diào)用的函數(shù),該函數(shù)接收兩個(gè)int整數(shù),和一個(gè)算術(shù)運(yùn)算符,返回兩數(shù)的運(yùn)算結(jié)果int calc(int a, int b, char op){FP_CALC fp = calc_func(op); //根據(jù)預(yù)算符得到各種運(yùn)算的函數(shù)的地址int (*s_fp)(int, int) = s_calc_func(op);//用于測(cè)試// ASSERT(fp == s_fp); // 可以斷言這倆是相等的if (fp) return fp(a, b);//根據(jù)上一步得到的函數(shù)的地址調(diào)用相應(yīng)函數(shù),并返回結(jié)果else return -1;}void main(){int a = 100, b = 20;printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));}
運(yùn)行結(jié)果
calc(100, 20, +) = 120
calc(100, 20, -) = 80
calc(100, 20, *) = 2000
calc(100, 20, /) = 5
聯(lián)系客服