網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
C語(yǔ)言的結(jié)構(gòu)體內(nèi)嵌函數(shù)
看門見(jiàn)山
1.內(nèi)嵌函數(shù)定義舉例:經(jīng)過(guò)真實(shí)測(cè)試
在函數(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);
2.內(nèi)嵌函數(shù)的個(gè)人理解
C語(yǔ)言的結(jié)構(gòu)體內(nèi)部是可以定義函數(shù)的,就像java中定義方法一樣,我們?cè)跇?gòu)建對(duì)象的時(shí)候不止是可以使用它的參數(shù),還可以使用它內(nèi)部關(guān)于數(shù)據(jù)的處理函數(shù),java中叫做方法;但是C語(yǔ)言并不能實(shí)現(xiàn)類中方法的繼承,重載,重寫等特性,因此用的不是很多;
C語(yǔ)言是可以面向?qū)ο蟮模嫦驅(qū)ο笫且环N思想,將事物和做事的過(guò)程定義成對(duì)象,只是C語(yǔ)言的語(yǔ)法讓面向?qū)ο笞兊貌荒敲春糜谩?/p>
C語(yǔ)言是要轉(zhuǎn)化為匯編語(yǔ)言再轉(zhuǎn)化為機(jī)器語(yǔ)言運(yùn)行的,在匯編語(yǔ)言中存在著聲明代碼段的過(guò)程,將一段匯編指令之前加上一個(gè)標(biāo)號(hào),而這個(gè)標(biāo)號(hào)就是函數(shù)的名稱,我們所說(shuō)的函數(shù)名實(shí)際上代表了一段構(gòu)匯編指令的初始內(nèi)存地址。那么變量可以附地址,函數(shù)也是可以的,有興趣的可以看一下匯編語(yǔ)言和C語(yǔ)言混合編程,就理解了內(nèi)嵌函數(shù)中出現(xiàn)的函數(shù)指針。
結(jié)構(gòu)體嵌套函數(shù)指針
這次來(lái)記錄一下結(jié)構(gòu)體嵌套函數(shù)指針
這個(gè)知識(shí)點(diǎn)想了2天終于搞懂了。
先看代碼,試著理解一下,不理解再看我后面的解釋。
解釋
首先,和平常創(chuàng)建一個(gè)結(jié)構(gòu)體一樣,唯獨(dú)不同的就是里面的變量是一個(gè)函數(shù)指針,關(guān)于函數(shù)指針的內(nèi)容,原理,我這里就不多解釋說(shuō)明了,去搜一下都有很多。我們就簡(jiǎn)單的理解為:函數(shù)指針=指向函數(shù)地址的指針變量。
所以這里的?void (*m_PrintInfo)();是一個(gè)變量,是一個(gè)變量,是一個(gè)變量(重要的事情說(shuō)三遍)!
typedef struct{
char m_title[20];
char m_author[20];
int m_pages;
void (*m_PrintInfo)();
} BookType;
這個(gè)變量是干嘛的呢?是用來(lái)存放函數(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)體的成員(重要的事情說(shuō)三遍)!
也就是說(shuō),都有這些元素,這樣好理解了吧。
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
好,那么我們來(lái)看下面的這行代碼
KEY[0].m_PrintInfo();
那這里是調(diào)用了哪個(gè)函數(shù)呢?通過(guò)代碼可以知道,是調(diào)用了ON_OFF_Pro這個(gè)函數(shù)。所以執(zhí)行調(diào)用這個(gè)結(jié)構(gòu)體成員變量的時(shí)候,會(huì)調(diào)用這個(gè)函數(shù),因?yàn)橐婚_(kāi)始已經(jīng)把函數(shù)的入口地址分配好了,只需要調(diào)用結(jié)構(gòu)體成員變量就能夠?qū)崿F(xiàn)調(diào)用函數(shù)。
-------------------------------------------------------- 分界線---------------------------------------------------------------
下面來(lái)看看實(shí)際項(xiàng)目按鍵的用法
總結(jié)
以上所有內(nèi)容均為自己筆記,僅讓自己理解為主導(dǎo)!
原文鏈接:https://blog.csdn.net/qq_39490500/article/details/80457831
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2022-07-31 Android中View.post和Handler.post的關(guān)系_Android
- 2022-03-30 詳解Python的條件語(yǔ)句_python
- 2022-05-10 詳解CLR的內(nèi)存分配和回收機(jī)制_C#教程
- 2022-10-27 golang?map的基本操作及定義方式_Golang
- 2024-01-15 idea 折疊代碼塊技巧 關(guān)于<editor-fold>
- 2024-01-06 RocketMQ死信消息解決方案
- 2022-12-22 Go語(yǔ)言編程通過(guò)dwarf獲取內(nèi)聯(lián)函數(shù)_Golang
- 2022-11-14 Redis主從復(fù)制分步講解使用_Redis
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支