日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【转】typedef函数指针的用法(C++)

發(fā)布時間:2025/3/14 c/c++ 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】typedef函数指针的用法(C++) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文: typedef函數(shù)指針的用法(C++)

 代碼簡化, 促進跨平臺開發(fā)的目的.

 typedef 行為有點像 #define 宏,用其實際類型替代同義字。

 不同點:typedef 在編譯時被解釋,因此讓編譯器來應(yīng)付超越預(yù)處理器能力的文本替換

用法一:

typedef?int?(*MYFUN)(int, int);
這種用法一般用在給函數(shù)定義別名的時候
上面的例子定義MYFUN?是一個函數(shù)指針, 函數(shù)類型是帶兩個int 參數(shù), 返回一個int

分析這種形式的定義的時候可以用下面的方法:
先去掉typedef 和別名,?剩下的就是原變量的類型.
去掉typedef和MYFUN以后就剩:
int (*)(int, int)

用法二:

typedef給變量類型定義一個別名.

typedef?struct{
int a;
int b;
}MY_TYPE;

這里把一個未命名結(jié)構(gòu)直接取了一個叫MY_TYPE的別名, 這樣如果你想定義結(jié)構(gòu)的實例的時候就可以這樣:
MY_TYPE tmp;

第二種用法:typedef?原變量類型?別名

typedef補充內(nèi)容:

例如:

  typedef int (*PF) (const char *, const char *);

  這個聲明引入了?PF 類型作為函數(shù)指針的同義字,該函數(shù)有兩個 const char * 類型的參數(shù)以及一個 int 類型的返回值

簡單的函數(shù)指針的用法

//形式1:返回類型(*函數(shù)名)(參數(shù)表)

char(*pFun)(int);

char glFun(int a){return;}

void main()

{

pFun =glFun;

(*pFun)(2);

}

第一行定義了一個指針變量pFun.它是一個指向某種函數(shù)的指針,這種函數(shù)參數(shù)是一個int類型,返回值是char類型。只有第一句我們還無法使用這個指針,因為我們還未對它進行賦值

第二行定義了一個函數(shù)glFun().該函數(shù)正好是一個以int為參數(shù)返回char的函數(shù)。我們要從指針的層次上理解函數(shù)-函數(shù)的函數(shù)名實際上就是一個指針函數(shù)名指向該函數(shù)的代碼在內(nèi)存中的首地址

使用typedef更直接

typedef?char(*PTRFUN)(int)

PTRFUN pFun;

char glFun(int a){return;}

void main()

{

pFun = glFun;

(*pFun)(2);

}

typedef的功能是定義新的類型。第一句就是定義了一種PTRFUN的類型,并定義這種類型為指向某種函數(shù)的指針,這種函數(shù)以一個int為參數(shù)并返回char類型。

//

下面是個例子:

//

在typedef的使用中,最麻煩的是指向函數(shù)的指針,如果沒有下面的函數(shù),你知道下面這個表達式的定義以及如何使用它嗎?

?

int (*s_calc_func(char op))(int, int);


如果不知道,請看下面的程序,里面有比較詳細的說明

?


// 定義四個函數(shù)

int add(int, int);

int sub(int, int);

int mul(int, int);

int div(int, int);

// 定義指向這類函數(shù)的指針

typedef int (*FP_CALC)(int, int);


// 我先不介紹,大家能看懂下一行的內(nèi)容嗎?

int (*s_calc_func(char op))(int, int);


// 下一行的內(nèi)容與上一行完全相同,

// 定義一個函數(shù)calc_func,它根據(jù)操作字符 op 返回指向相應(yīng)的計算函數(shù)的指針

FP_CALC calc_func(char op);


// 根據(jù) op 返回相應(yīng)的計算結(jié)果值

int calc(int a, int b, char op);


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ù)作業(yè)和調(diào)用方式的完全相同,

// 參數(shù)為op,而不是最后的兩個整形

int (*s_calc_func(char op)) (int, int)

{

????return calc_func(op);

}


FP_CALC calc_func(char op)

{

????switch (op)

????{

????case '+': return add;

????case '-': return sub;

????case '*': return mul;

????case '/': return div;

????default:

????????return NULL;

????}

????return NULL;

}


int calc(int a, int b, char op)

{

???? FP_CALC fp = calc_func(op); // 下面是類似的直接定義指向函數(shù)指針變量

???????// 下面這行是不用typedef,來實現(xiàn)指向函數(shù)的指針的例子,麻煩!

????????int (*s_fp)(int, int) = s_calc_func(op);

????????// ASSERT(fp == s_fp); // 可以斷言這倆是相等的

????  if (fp) return fp(a, b);

???? else return -1;

}


void test_fun()

{

????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, '/'));

}


運行結(jié)果

???calc(100, 20, +) = 120

???calc(100, 20, -) = 80

???calc(100, 20, *) = 2000

???calc(100, 20, /) = 5

轉(zhuǎn)載于:https://www.cnblogs.com/kegeyang/archive/2012/03/24/2415097.html

總結(jié)

以上是生活随笔為你收集整理的【转】typedef函数指针的用法(C++)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。