伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

C语言中的构造体内嵌函数用法

目录

    C语言的构造体内嵌函数
      1.内嵌函数定义举例:经过真实测试2.内嵌函数的个人理解
    构造体嵌套函数指针
      解释
    总结


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天终于搞懂了。
先看代码,试着理解一下,不理解再看我后面的解释。
C语言中的构造体内嵌函数用法-1.png


解释

首先,和平常创建一个构造体一样,唯独不同的就是里面的变量是一个函数指针,关于函数指针的内容,原理,我这里就不多解释说明了,去搜一下都有很多。我们就简单的理解为:函数指针=指向函数地址的指针变量。
所以这里的 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这个函数。所以执行调用这个构造体成员变量的时候,会调用这个函数,因为一开端已经把函数的入口地址分配好了,只需要调用构造体成员变量就可以实现调用函数。
C语言中的构造体内嵌函数用法-2.png

-------------------------------------------------------- 分界线---------------------------------------------------------------
下面来看看实际项目按键的用法
C语言中的构造体内嵌函数用法-3.jpg

C语言中的构造体内嵌函数用法-4.png


总结

以上所有内容均为自己笔记,仅让自己理解为主导!
这些仅为个人经历,希望能给大家一个参考,也希望大家多多支持网站。

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

瑶耘
注册会员
主题 23
回复 23
粉丝 0
|网站地图
快速回复 返回顶部 返回列表