|
在網(wǎng)上搜索函數(shù)指針,看到一個例子。開始沒看懂,想放棄,可是轉(zhuǎn)念一想,這個用法遲早要弄懂的,現(xiàn)在多花點(diǎn)時間看懂它,好過以后碰到了要再花一倍時間來弄懂它。其實(shí)很多時候都是這樣,如果每次到難一點(diǎn)的內(nèi)容,總想著下次我再來解決它,那就永遠(yuǎn)也學(xué)不到東西。 后面那個例子加了注釋,是我對這種用法的理解,希望對新手有所幫助。
進(jìn)入正文: 代碼簡化, 促進(jìn)跨平臺開發(fā)的目的. typedef 行為有點(diǎn)像 #define 宏,用其實(shí)際類型替代同義字。 不同點(diǎn):typedef 在編譯時被解釋,因此讓編譯器來應(yīng)付超越預(yù)處理器能力的文本替換。 用法一: typedef int (*MYFUN)(int, int); 用法二: typedef給變量類型定義一個別名. typedef struct{
第二種用法:typedef 原變量類型 別名 簡單的函數(shù)指針的用法 //形式1:返回類型(*函數(shù)名)(參數(shù)表) char(*pFun)(int); //typedef char(*pFun)(int) //跟上一行功能等同 /*typedef的功能是定義新的類型。第一句就是定義了一種PTRFUN的類型,并定義這種類型為指向某種函數(shù)的指針,這種函數(shù)以一個int為參數(shù)并返回char類型。*/ char glFun(int a){return;} void main() { pFun =glFun; (*pFun)(2); } 第一行定義了一個指針變量pFun.它是一個指向某種函數(shù)的指針,這種函數(shù)參數(shù)是一個int類型,返回值是char類型。只有第一句我們還無法使用這個指針,因?yàn)槲覀冞€未對它進(jìn)行賦值。 第二行定義了一個函數(shù)glFun().該函數(shù)正好是一個以int為參數(shù)返回char的函數(shù)。我們要從指針的層次上理解函數(shù)-函數(shù)的函數(shù)名實(shí)際上就是一個指針,函數(shù)名指向該函數(shù)的代碼在內(nèi)存中的首地址。
下面是一個例子:
//#include<iostream.h>
#include<stdio.h>
typedef int (*FP_CALC)(int, int);
//注意這里不是函數(shù)聲明而是函數(shù)定義,它是一個地址,你可以直接輸出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;
}
//定義一個函數(shù),參數(shù)為op,返回一個指針。該指針類型為 擁有兩個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,
//返回值為一個擁有 兩個int參數(shù)、返回類型為int 的函數(shù)指針
int (*s_calc_func(char op)) (int, int)
{
return calc_func(op);
}
//最終用戶直接調(diào)用的函數(shù),該函數(shù)接收兩個int整數(shù),和一個算術(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);//用于測試
// 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 |
|
|