詳解C語(yǔ)言結(jié)構(gòu)體中的函數(shù)指針
結(jié)構(gòu)體是由一系列具有相同類(lèi)型或不同類(lèi)型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合。所以,標(biāo)準(zhǔn)C中的結(jié)構(gòu)體是不允許包含成員函數(shù)的,當(dāng)然C++中的結(jié)構(gòu)體對(duì)此進(jìn)行了擴(kuò)展。那么,我們?cè)贑語(yǔ)言的結(jié)構(gòu)體中,只能通過(guò)定義函數(shù)指針的方式,用函數(shù)指針指向相應(yīng)函數(shù),以此達(dá)到調(diào)用函數(shù)的目的。
函數(shù)指針
函數(shù)類(lèi)型 (*指針變量名)(形參列表);第一個(gè)括號(hào)一定不能少。
“函數(shù)類(lèi)型”說(shuō)明函數(shù)的返回類(lèi)型,由于“()”的優(yōu)先級(jí)高于“*”,所以指針變量名外的括號(hào)必不可少。
注意指針函數(shù)與函數(shù)指針表示方法的不同,千萬(wàn)不要混淆。最簡(jiǎn)單的辨別方式就是看函數(shù)名前面的指針*號(hào)有沒(méi)有被括號(hào)()包含,如果被包含就是函數(shù)指針,反之則是指針函數(shù)。
要聲明一個(gè)函數(shù)指針,使用下面的語(yǔ)法:
Return Type ( * function pointer's variable name ) ( parameters )
例如聲明一個(gè)名為func的函數(shù)指針,接收兩個(gè)整型參數(shù)并且返回一個(gè)整型值
int (*func)(int a , int b ) ;
可以方便的使用類(lèi)型定義運(yùn)用于函數(shù)指針:
typedef int (*func)(int a , int b ) ;
結(jié)構(gòu)體中的函數(shù)指針
我們首先定義一個(gè)名為Operation的函數(shù)指針:
typedef int (*Operation)(int a , int b );
再定義一個(gè)簡(jiǎn)單的名為STR的結(jié)構(gòu)體
typedef struct _str { int result ; // 用來(lái)存儲(chǔ)結(jié)果 Operation opt; // 函數(shù)指針 } STR;
現(xiàn)在來(lái)定義兩個(gè)函數(shù):Add和Multi:
//a和b相加 int Add (int a, int b){ return a + b ; } //a和b相乘 int Multi (int a, int b){ return a * b ; }
現(xiàn)在我們可以寫(xiě)main函數(shù),并且將函數(shù)指針指向正確的函數(shù):
int main (int argc , char **argv){ STR str_obj; str_obj.opt = Add; //函數(shù)指針變量指向Add函數(shù) str_obj. result = str_obj.opt(5,3); printf (" the result is %d\n", str_obj.result ); str_obj.opt= Multi; //函數(shù)指針變量指向Multi函數(shù) str_obj. result = str_obj.opt(5,3); printf (" the result is %d\n", str_obj.result ); return 0 ; }
運(yùn)行結(jié)果如下:
the result is 8 the result is 15
完整的代碼如下:
#include<stdio.h> typedef int (*Operation)(int a, int b); typedef struct _str { int result ; // to sotre the resut Operation opt; // funtion pointer } STR; //a和b相加 int Add (int a, int b){ return a + b ; } //a和b相乘 int Multi (int a, int b){ return a * b ; } int main (int argc , char **argv){ STR str_obj; str_obj.opt = Add; //函數(shù)指針變量指向Add函數(shù) str_obj. result = str_obj.opt(5,3); printf ("the result is %d\n", str_obj.result ); str_obj.opt= Multi; //函數(shù)指針變量指向Multi函數(shù) str_obj. result = str_obj.opt(5,3); printf ("the result is %d\n", str_obj.result ); return 0 ; }
相關(guān)文章
Qt學(xué)習(xí)教程之表格控件螞蟻線(xiàn)詳解
如果有用過(guò)PS的選區(qū)工具應(yīng)該就會(huì)知道螞蟻線(xiàn)是什么東西了,就是用來(lái)表示選區(qū)的一種虛線(xiàn),關(guān)鍵還是要?jiǎng)討B(tài)的!下面這篇文章主要給大家介紹了關(guān)于Qt學(xué)習(xí)教程之表格控件螞蟻線(xiàn)的相關(guān)資料,需要的朋友可以參考下2018-07-07QT實(shí)現(xiàn)按鈕開(kāi)關(guān)Form窗體的效果的示例代碼
本文主要介紹了QT實(shí)現(xiàn)按鈕開(kāi)關(guān)Form窗體的效果的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法詳解
以下是對(duì)static_cast,dynamic_cast,reinterpret_cast,const_cast的區(qū)別及用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09c++實(shí)現(xiàn)獲取當(dāng)前時(shí)間(精確至秒,毫秒和微妙)
這篇文章主要為大家詳細(xì)介紹了c++實(shí)現(xiàn)獲取當(dāng)前時(shí)間(可以精確至秒,毫秒和微妙)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2023-11-11C++?實(shí)現(xiàn)讀寫(xiě)鎖的代碼詳解
C++讀寫(xiě)鎖是一種多線(xiàn)程同步機(jī)制,它允許多個(gè)線(xiàn)程同時(shí)讀取共享數(shù)據(jù),但只允許一個(gè)線(xiàn)程寫(xiě)入共享數(shù)據(jù),這種鎖可以提高程序的并發(fā)性和性能,本文給大家介紹了C++?實(shí)現(xiàn)讀寫(xiě)鎖的代碼,需要的朋友可以參考下2023-10-10C語(yǔ)言編程基礎(chǔ)char類(lèi)型轉(zhuǎn)換示例
這篇文章主要為大家介紹了C語(yǔ)言編程基礎(chǔ)char類(lèi)型轉(zhuǎn)換示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06C++ normal_distribution高斯正態(tài)分布函數(shù)的用法示例
高斯分布也稱(chēng)為正態(tài)分布(normal distribution),常用的成熟的生成高斯分布隨機(jī)數(shù)序列的方法由Marsaglia和Bray在1964年提出,這篇文章主要給大家介紹了關(guān)于C++ normal_distribution高斯正態(tài)分布函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2021-07-07