網站首頁 編程語言 正文
C語言的結構體內嵌函數
看門見山
1.內嵌函數定義舉例:經過真實測試
在函數中聲明定義結構體
#include "fun_in_struct.h"
?
int main(int argc, char **argv) {
? ? //定義結構體指針或者結構體變量,分別用->和.進行內部元素的使用
? ? data_store_object *obj;
? ? char ? ? ? ? ? ? ?*word;
?
? ? /*方法一:直接定義結構體指針然后用->對結構體變量和函數進行初始化
? ? 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;
? ? */
? ? ?/*方法二:直接定義結構體變量然后直接進行初始化,用 ? ?變量 = xxx;進行賦值
? ? 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;
? ? */
? ? /*方法三:直接定義結構體變量,然后使用 ? ?變量 : xx進行賦值
? ? 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;
? ? */
在頭文件中對結構體進行定義:??
typedef struct {
? ? char *word;
? ? int ? count;
? ? void (*word_print)(char *word);
? ? int ?(*count_print)(int count);
}data_store_object;
進行兩個函數的聲明,函數的定義發生在其他的源文件
void WordPrint(char *word);
int ?CountPrint(int count);
2.內嵌函數的個人理解
C語言的結構體內部是可以定義函數的,就像java中定義方法一樣,我們在構建對象的時候不止是可以使用它的參數,還可以使用它內部關于數據的處理函數,java中叫做方法;但是C語言并不能實現類中方法的繼承,重載,重寫等特性,因此用的不是很多;
C語言是可以面向對象的,面向對象是一種思想,將事物和做事的過程定義成對象,只是C語言的語法讓面向對象變得不那么好用。
C語言是要轉化為匯編語言再轉化為機器語言運行的,在匯編語言中存在著聲明代碼段的過程,將一段匯編指令之前加上一個標號,而這個標號就是函數的名稱,我們所說的函數名實際上代表了一段構匯編指令的初始內存地址。那么變量可以附地址,函數也是可以的,有興趣的可以看一下匯編語言和C語言混合編程,就理解了內嵌函數中出現的函數指針。
結構體嵌套函數指針
這次來記錄一下結構體嵌套函數指針
這個知識點想了2天終于搞懂了。
先看代碼,試著理解一下,不理解再看我后面的解釋。
解釋
首先,和平常創建一個結構體一樣,唯獨不同的就是里面的變量是一個函數指針,關于函數指針的內容,原理,我這里就不多解釋說明了,去搜一下都有很多。我們就簡單的理解為:函數指針=指向函數地址的指針變量。
所以這里的?void (*m_PrintInfo)();是一個變量,是一個變量,是一個變量(重要的事情說三遍)!
typedef struct{
char m_title[20];
char m_author[20];
int m_pages;
void (*m_PrintInfo)();
} BookType;
這個變量是干嘛的呢?是用來存放函數的入口地址的,每個函數都是有入口地址的。
BookType KEY[3]={
{"KEY1","Author1",5,ON_OFF_Pro},
{"KEY2","Author2",10,CAL_Pro},
{"KEY3","Author3",15,MENU_Pro},
};
這段代碼,定義了3結構體數組,
- 1.每個數組里面都有該結構體的成員
- 2.每個數組里面都有該結構體的成員
- 3.每個數組里面都有該結構體的成員(重要的事情說三遍)!
也就是說,都有這些元素,這樣好理解了吧。
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();
那這里是調用了哪個函數呢?通過代碼可以知道,是調用了ON_OFF_Pro這個函數。所以執行調用這個結構體成員變量的時候,會調用這個函數,因為一開始已經把函數的入口地址分配好了,只需要調用結構體成員變量就能夠實現調用函數。
-------------------------------------------------------- 分界線---------------------------------------------------------------
下面來看看實際項目按鍵的用法
總結
以上所有內容均為自己筆記,僅讓自己理解為主導!
原文鏈接:https://blog.csdn.net/qq_39490500/article/details/80457831
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-04-25 jQuery利用鍵盤上下鍵移動表格內容_jquery
- 2022-07-07 python中列表對象pop()方法的使用說明_python
- 2022-06-14 C#通過cmd調用7z軟件實現壓縮和解壓文件_C#教程
- 2023-01-07 詳解C++11中綁定器bind的原理與使用_C 語言
- 2022-05-04 Python的五個標準數據類型你認識幾個_python
- 2022-08-28 Spring Boot整合ElasticSearch
- 2022-11-18 阿里云kubernetes查找鏡像中jar包的方法(docker查看鏡像中的jar)_云其它
- 2022-12-24 Android設置Padding和Margin(動態/靜態)的方法實例_Android
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支