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

 更新时间:2023年02月24日 10:29:50   作者:大熊c  
这篇文章主要介绍了C语言中的结构体内嵌函数用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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这个函数。所以执行调用这个结构体成员变量的时候,会调用这个函数,因为一开始已经把函数的入口地址分配好了,只需要调用结构体成员变量就能够实现调用函数。

-------------------------------------------------------- 分界线---------------------------------------------------------------

下面来看看实际项目按键的用法

总结

以上所有内容均为自己笔记,仅让自己理解为主导!

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言详细分析不同类型数据在内存中的存储

    C语言详细分析不同类型数据在内存中的存储

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-08-08
  • C++ 中的异常抛出和捕获方式

    C++ 中的异常抛出和捕获方式

    这篇文章主要介绍了C++ 中的异常抛出和捕获方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++中的函数你真的理解了吗

    C++中的函数你真的理解了吗

    这篇文章主要为大家详细介绍了C++中的函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言中对数组赋值的三种形式

    C语言中对数组赋值的三种形式

    这篇文章主要给大家介绍了关于C语言中对数组赋值的3种形式,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • C++快速排序及优化方案详解

    C++快速排序及优化方案详解

    这篇文章主要介绍了C++快速排序及优化方案详解,快速排序是一种常用的排序算法,它通过选择一个基准元素,将数组分成两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素,需要的朋友可以参考下
    2023-10-10
  • C++排序算法之插入排序解析

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

    这篇文章主要介绍了C++排序算法之插入排序解析,将数组分为有序表和无序表,每次从有序表中取出一个元素,插入到有序表的适当位置,每遍历一次,有序表中元素增加一个,无序表中元素个数减少一个,重复n-1次,完成排序,需要的朋友可以参考下
    2023-10-10
  • C语言编程C++自定义个性化类型

    C语言编程C++自定义个性化类型

    这篇文章主要介绍了C语言编程中如何来自定义C++个性化类型,文中附含详细的示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • C++无痛实现日期类的示例代码

    C++无痛实现日期类的示例代码

    凡是要写类必须要提到六大默认成员(六位大爷):构造函数、析构函数、拷贝构造函数、赋值重载函数、取地址重载函数(包括const对象和普通对象);那么这次的日期类又需要伺候哪几位大爷呢?本文就来详细说说
    2022-10-10
  • 浅谈mwArray和一般数组的区别

    浅谈mwArray和一般数组的区别

    下面小编就为大家带来一篇浅谈mwArray和一般数组的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言冒泡排序法心得

    C语言冒泡排序法心得

    相信学过C语言的朋友都知道,在C语言中,常用的排序算法有:冒泡排序、快速排序、插入排序、选择排序、希尔排序、堆排序以及归并排序等等。就算没有用过,相信大家也有所耳闻。在这里呢,主要是想和大家一起来探讨探讨C语言的冒泡排序法,
    2016-01-01

最新评论