最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)用法

 更新時(shí)間:2023年02月24日 10:29:50   作者:大熊c  
這篇文章主要介紹了C語言中的結(jié)構(gòu)體內(nèi)嵌函數(shù)用法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C語言的結(jié)構(gòu)體內(nèi)嵌函數(shù)

看門見山

1.內(nèi)嵌函數(shù)定義舉例:經(jīng)過真實(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)體指針然后用->對結(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;
? ? */

在頭文件中對結(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);

2.內(nèi)嵌函數(shù)的個(gè)人理解

C語言的結(jié)構(gòu)體內(nèi)部是可以定義函數(shù)的,就像java中定義方法一樣,我們在構(gòu)建對象的時(shí)候不止是可以使用它的參數(shù),還可以使用它內(nèi)部關(guān)于數(shù)據(jù)的處理函數(shù),java中叫做方法;但是C語言并不能實(shí)現(xiàn)類中方法的繼承,重載,重寫等特性,因此用的不是很多;

C語言是可以面向?qū)ο蟮?,面向?qū)ο笫且环N思想,將事物和做事的過程定義成對象,只是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ù)指針

這次來記錄一下結(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)目按鍵的用法

總結(jié)

以上所有內(nèi)容均為自己筆記,僅讓自己理解為主導(dǎo)!

這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言詳細(xì)分析不同類型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    C語言詳細(xì)分析不同類型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)

    使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2022-08-08
  • C++ 中的異常拋出和捕獲方式

    C++ 中的異常拋出和捕獲方式

    這篇文章主要介紹了C++ 中的異常拋出和捕獲方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++中的函數(shù)你真的理解了嗎

    C++中的函數(shù)你真的理解了嗎

    這篇文章主要為大家詳細(xì)介紹了C++中的函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言中對數(shù)組賦值的三種形式

    C語言中對數(shù)組賦值的三種形式

    這篇文章主要給大家介紹了關(guān)于C語言中對數(shù)組賦值的3種形式,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C語言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • C++快速排序及優(yōu)化方案詳解

    C++快速排序及優(yōu)化方案詳解

    這篇文章主要介紹了C++快速排序及優(yōu)化方案詳解,快速排序是一種常用的排序算法,它通過選擇一個(gè)基準(zhǔn)元素,將數(shù)組分成兩個(gè)子數(shù)組,其中一個(gè)子數(shù)組的所有元素都小于基準(zhǔn)元素,另一個(gè)子數(shù)組的所有元素都大于基準(zhǔn)元素,需要的朋友可以參考下
    2023-10-10
  • C++排序算法之插入排序解析

    C++排序算法之插入排序解析

    這篇文章主要介紹了C++排序算法之插入排序解析,將數(shù)組分為有序表和無序表,每次從有序表中取出一個(gè)元素,插入到有序表的適當(dāng)位置,每遍歷一次,有序表中元素增加一個(gè),無序表中元素個(gè)數(shù)減少一個(gè),重復(fù)n-1次,完成排序,需要的朋友可以參考下
    2023-10-10
  • C語言編程C++自定義個(gè)性化類型

    C語言編程C++自定義個(gè)性化類型

    這篇文章主要介紹了C語言編程中如何來自定義C++個(gè)性化類型,文中附含詳細(xì)的示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • C++無痛實(shí)現(xiàn)日期類的示例代碼

    C++無痛實(shí)現(xiàn)日期類的示例代碼

    凡是要寫類必須要提到六大默認(rèn)成員(六位大爺):構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、賦值重載函數(shù)、取地址重載函數(shù)(包括const對象和普通對象);那么這次的日期類又需要伺候哪幾位大爺呢?本文就來詳細(xì)說說
    2022-10-10
  • 淺談mwArray和一般數(shù)組的區(qū)別

    淺談mwArray和一般數(shù)組的區(qū)別

    下面小編就為大家?guī)硪黄獪\談mwArray和一般數(shù)組的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C語言冒泡排序法心得

    C語言冒泡排序法心得

    相信學(xué)過C語言的朋友都知道,在C語言中,常用的排序算法有:冒泡排序、快速排序、插入排序、選擇排序、希爾排序、堆排序以及歸并排序等等。就算沒有用過,相信大家也有所耳聞。在這里呢,主要是想和大家一起來探討探討C語言的冒泡排序法,
    2016-01-01

最新評論

阿城市| 邛崃市| 长沙县| 元朗区| 望江县| 岳阳市| 梓潼县| 东乌| 通城县| 米林县| 集安市| 泸西县| 博客| 河北区| 襄城县| 深圳市| 武穴市| 嘉鱼县| 峨山| 灵台县| 会理县| 郴州市| 阳西县| 武强县| 台南市| 石狮市| 定远县| 贵州省| 延边| 镇雄县| 京山县| 汾西县| 富蕴县| 阳山县| 申扎县| 莱西市| 凉山| 屯昌县| 江都市| 永平县| 大埔区|