您好,登錄后才能下訂單哦!
今天小編給大家分享一下C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)如何使用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
看門見山
在函數(shù)中聲明定義結(jié)構(gòu)體
#include "fun_in_struct.h" int main(int argc, char **argv) { //定義結(jié)構(gòu)體指針或者結(jié)構(gòu)體變量,分別用->和.進(jìn)行內(nèi)部元素的使用 data_store_object *obj; char *word; /*方法一:直接定義結(jié)構(gòu)體指針然后用->對(duì)結(jié)構(gòu)體變量和函數(shù)進(jìn)行初始化 word = "nihao"; obj = calloc(1,sizeof(data_store_object)); obj->word = word; obj->count = 24; obj->word_print = WordPrint; obj->count_print = CountPrint; obj->word_print(obj->word); printf("%d\n",obj->count_print(obj->count)); return 0; */ /*方法二:直接定義結(jié)構(gòu)體變量然后直接進(jìn)行初始化,用 變量 = xxx;進(jìn)行賦值 data_store_object obj = { .word = "nihao", .count = 12, .word_print = WordPrint, .count_print = CountPrint }; obj.word_print(obj.word); printf("%d\n",obj.count_print(obj.count)); return 0; */ /*方法三:直接定義結(jié)構(gòu)體變量,然后使用 變量 : xx進(jìn)行賦值 data_store_object obj = { word : "nihao", count : 33, word_print : WordPrint, count_print : CountPrint }; obj.word_print(obj.word); printf("%d\n",obj.count_print(obj.count)); return 0; */
在頭文件中對(duì)結(jié)構(gòu)體進(jìn)行定義:
typedef struct { char *word; int count; void (*word_print)(char *word); int (*count_print)(int count); }data_store_object;
進(jìn)行兩個(gè)函數(shù)的聲明,函數(shù)的定義發(fā)生在其他的源文件
void WordPrint(char *word); int CountPrint(int count);
C語言的結(jié)構(gòu)體內(nèi)部是可以定義函數(shù)的,就像java中定義方法一樣,我們在構(gòu)建對(duì)象的時(shí)候不止是可以使用它的參數(shù),還可以使用它內(nèi)部關(guān)于數(shù)據(jù)的處理函數(shù),java中叫做方法;但是C語言并不能實(shí)現(xiàn)類中方法的繼承,重載,重寫等特性,因此用的不是很多;
C語言是可以面向?qū)ο蟮模嫦驅(qū)ο笫且环N思想,將事物和做事的過程定義成對(duì)象,只是C語言的語法讓面向?qū)ο笞兊貌荒敲春糜谩?/p>
C語言是要轉(zhuǎn)化為匯編語言再轉(zhuǎn)化為機(jī)器語言運(yùn)行的,在匯編語言中存在著聲明代碼段的過程,將一段匯編指令之前加上一個(gè)標(biāo)號(hào),而這個(gè)標(biāo)號(hào)就是函數(shù)的名稱,我們所說的函數(shù)名實(shí)際上代表了一段構(gòu)匯編指令的初始內(nèi)存地址。那么變量可以附地址,函數(shù)也是可以的,有興趣的可以看一下匯編語言和C語言混合編程,就理解了內(nèi)嵌函數(shù)中出現(xiàn)的函數(shù)指針。
這次來記錄一下結(jié)構(gòu)體嵌套函數(shù)指針
這個(gè)知識(shí)點(diǎn)想了2天終于搞懂了。
先看代碼,試著理解一下,不理解再看我后面的解釋。
首先,和平常創(chuàng)建一個(gè)結(jié)構(gòu)體一樣,唯獨(dú)不同的就是里面的變量是一個(gè)函數(shù)指針,關(guān)于函數(shù)指針的內(nèi)容,原理,我這里就不多解釋說明了,去搜一下都有很多。我們就簡單的理解為:函數(shù)指針=指向函數(shù)地址的指針變量。
所以這里的 void (*m_PrintInfo)();是一個(gè)變量,是一個(gè)變量,是一個(gè)變量(重要的事情說三遍)!
typedef struct{ char m_title[20]; char m_author[20]; int m_pages; void (*m_PrintInfo)(); } BookType;
這個(gè)變量是干嘛的呢?是用來存放函數(shù)的入口地址的,每個(gè)函數(shù)都是有入口地址的。
BookType KEY[3]={ {"KEY1","Author1",5,ON_OFF_Pro}, {"KEY2","Author2",10,CAL_Pro}, {"KEY3","Author3",15,MENU_Pro}, };
這段代碼,定義了3結(jié)構(gòu)體數(shù)組,
1.每個(gè)數(shù)組里面都有該結(jié)構(gòu)體的成員
2.每個(gè)數(shù)組里面都有該結(jié)構(gòu)體的成員
3.每個(gè)數(shù)組里面都有該結(jié)構(gòu)體的成員(重要的事情說三遍)!
也就是說,都有這些元素,這樣好理解了吧。
KEY[0].m_title KEY[1].m_title KEY[2].m_title
KEY[0].m_author KEY[1].m_author KEY[2].m_author
KEY[0].m_pages KEY[1].m_pages KEY[2].m_pages
好,那么我們來看下面的這行代碼
KEY[0].m_PrintInfo();
那這里是調(diào)用了哪個(gè)函數(shù)呢?通過代碼可以知道,是調(diào)用了ON_OFF_Pro這個(gè)函數(shù)。所以執(zhí)行調(diào)用這個(gè)結(jié)構(gòu)體成員變量的時(shí)候,會(huì)調(diào)用這個(gè)函數(shù),因?yàn)橐婚_始已經(jīng)把函數(shù)的入口地址分配好了,只需要調(diào)用結(jié)構(gòu)體成員變量就能夠?qū)崿F(xiàn)調(diào)用函數(shù)。
-------------------------------------------------------- 分界線---------------------------------------------------------------
下面來看看實(shí)際項(xiàng)目按鍵的用法
以上就是“C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)如何使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。