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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

typedef 函数指针的用法

發布時間:2025/1/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 typedef 函数指针的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

進入正文:

 代碼簡化, 促進跨平臺開發的目的.

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

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

用法一:

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

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

用法二:

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

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

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

?

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

簡單的函數指針的用法

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

char(*pFun)(int);

//typedef?char(*pFun)(int)?? //跟上一行功能等同

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

char glFun(int a){return;}

void main()

{

pFun =glFun;

(*pFun)(2);

}

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

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

?

下面是一個例子:

C代碼?
  • //#include<iostream.h>???
  • #include<stdio.h>???
  • ??
  • typedef?int?(*FP_CALC)(int,?int); ??
  • //注意這里不是函數聲明而是函數定義,它是一個地址,你可以直接輸出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; ??
  • } ??
  • //定義一個函數,參數為op,返回一個指針。該指針類型為?擁有兩個int參數、???
  • //返回類型為int?的函數指針。它的作用是根據操作符返回相應函數的地址???
  • 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; ??
  • } ??
  • //s_calc_func為函數,它的參數是?op,???
  • //返回值為一個擁有?兩個int參數、返回類型為int?的函數指針???
  • int?(*s_calc_func(char?op))?(int,?int) ??
  • { ??
  • ?????return?calc_func(op); ??
  • }? ??
  • //最終用戶直接調用的函數,該函數接收兩個int整數,和一個算術運算符,返回兩數的運算結果???
  • int?calc(int?a,?int?b,?char?op) ??
  • { ??
  • ?????FP_CALC?fp?=?calc_func(op);?//根據預算符得到各種運算的函數的地址???
  • ?????????int?(*s_fp)(int,?int)?=?s_calc_func(op);//用于測試???
  • ?????????//?ASSERT(fp?==?s_fp);???//?可以斷言這倆是相等的???
  • ?????if?(fp)?return?fp(a,?b);//根據上一步得到的函數的地址調用相應函數,并返回結果???
  • ?????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,?'/')); ??
  • }??
  • ?運行結果

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

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

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

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

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。