【C语言更新】结构体中实现函数成员以及回调函数

文/Edward

前面说,结构体内部的成员变量可以是普通变量,数组,除了这些变量之外,还可以是指针,结构体,枚举,共用体等。综上所述的结构体内部成员中,我们可以发现一个结构体内部的成员竟然不包含函数。

往往我们在写程序时,比如定义了某一个“对象”(注意这里不是指C++,C#,Java等高级语言中的对象概念)。如在C语言中定义了一个用作显示器初始化的对象,这里定义了一个内部成员变量int width,这个变量表示了当前系统中显示器的宽度,另一个变量为int height,这个变量表示了当前系统中显示器的高度。除了这两个常规的变量之外,我们在对显示器初始化时,会调用到函数“ScreenInit(intwidth, int height);”。

对于上述的应用中,如果是简单的单一显示器是完全没有任何问题的,但是当我们这个程序需要去被外界移植的时候,每个显示器除了有不同的width和height之外,其初始化函数也可能不同。对于这种应用,我们希望这个初始化函数也被包含在整个“对象”中,这样在移植的时候,我们除了定义显示器的长度,宽度之外,再重新写一个显示器的初始化函数,即可以非常方便地将这个显示器驱动移植过去。

除了上述这个应用之外,再比如,我们在写一个嵌入式芯片的框架程序时候,可以将每一个新建的任务定义成一个结构体,这个结构体里面包含了这个任务的调度时间,优先级,堆栈大小,以及具体的任务代码。

上述的两种应用中,除了我们定义结构体的普通成员变量之外,还需要在结构体里面定义一个非常重要的元素,即函数。而我们前面已经明确交代过C语言的结构体中是不能支持函数的,那么我们能否想一个办法出来让C语言的结构体可以去嵌入一个函数功能的成员进去呢?答案显然是可以的,因为C语言的结构体内部虽然无法去直接定义一个函数,但是C语言结构体内部的成员明确可以为一个指针,我们前面说了,C语言的指针可以指向一切具有地址的东西。

因此,要在C语言结构体中实现函数成员的思路就变得很明了了,即:

在C语言结构体内部定义一个指向函数的指针;

在具体“对象”初始化的时候,将结构体中的指向函数的指针指向具体实现功能的函数;

在这个函数需要调用时进行调用。

以上就是关于C语言结构体中实现函数成员的方法,如图1所示。

图1 C语言结构体中实现函数

再补充一点,上述这种原理,先将指向函数的指针指向具体的实现函数,后面再来统一调用,这种方式就是我们在C语言里面常说的回调函数。回调函数的应用有很多,比如当我们在做单片机中断的时候,就可以将单片机中断处理函数写成一个指向函数的指针,在每次单片机程序初始化的时候,将中断里面的函数指针指向具体的中断处理函数,等到中断产生的时候,单片机就可以去调用这个指向函数的指针了。而在程序运行的时候,我们也可以随时去修改这个指向函数的指针指向的对象,使程序更加灵活。

接下来,我们来写一些代码说明一下C语言结构体中实现函数成员。这里有一个实例,写一个程序,根据输入计算一个长方形的周长或者面积,假设键盘输入的数字为1,就计算这个长方形的周长,假设键盘输入的数字为0,就计算这个长方形的面积。

上述的这个程序可以有无数种做法,由于今天我们主要讲述结构体和回调函数,那么我们就使用这两个知识点来编写程序。

首先要做的就是为这个长方形定义一个可以存储它所有相关变量的结构体,我们想一下,这个结构体用来描述长方形,长方形的两个最关键的信息就是它的长度和宽度,因此这个结构体中一定要包含这两个信息。然后,我们的要求是要计算这个长方形的周长和面积,所以我们也可以将这两个变量一并定义在结构体里面,当然如果不想定义进结构体也没问题。接着我们要求是需要同时求这个长方形的面积和周长,因此我们可以为这个结构体定义一个指向函数的指针,根据不同的选项来修改这个指针指向的函数。最后,根据输入需要,修改这个结构体中指向函数的指针指向的函数,然后调用即可。因此可以写出如图2的程序。

图2 结构体内嵌函数成员的应用

(0)

相关推荐

  • 【C++学习笔记】深入了解C++ 结构体与共用体,看这篇就够了!

    结构体(struct)与共用体(union)是C语言中就已经存在的数据类型,C++对他们进行了扩充,最大的变化是允许在结构和公用体中定义成员函数.下面将通过实例讲解二者的特性和用法.   1.stru ...

  • 面试经验:68个C/C 常见面试题汇总(含答案)

    @程序员柠檬橙 是大厂C++软件工程师,所以在头条分享了很多 C++ 学习和面试相关内容,发现很同学在找工作面试之前找不到C++复习要点,于是我把常见的C++/C面试题做个汇总,方便大家在面试之前突击 ...

  • C语言 const 修饰函数参数 - C语言零基础入门教程

    目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 3.const 修饰在函数名前面 4.const 修饰在函数名后面 二.const 修饰函数参数 1.值传递 2.址传递 ...

  • C语言程序设计

    目录: 第1章 C语言概述 1.1 C语言程序结构 1.2 算法与程序设计 1.3 C语言的特点 1.4 VisualC++6.0上机操作 1.5 流程图与N-S图 1.6 结构化程序设计 实训1上机 ...

  • C语言对象编程第二弹:继承

    前言 继承简单说来就是父亲有的东西,孩子可以继承过来. 当创建一个类时,我们不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可. 这个已有的类称为基类,新建的类称为派生 ...

  • c语言结构体中的冒号的用法

    结构体中常见的冒号的用法是表示位域. 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可.为了节省存储空间,并使处理 ...

  • 【C语言】结构体占用字节数及存储与空间分配

    我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等. 在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取 ...

  • 嵌入式C语言之结构体对齐详解

    引言 https://m.toutiao.com/is/JctcUfB/ 结构体作为日常开发中使用最广泛的数据类型之一,其重要性不言而喻 .上一篇我们介绍了结构体的定义, 变量的初始化, 以及结构体元 ...

  • 嵌入式C语言之——结构体对齐详解

    嵌入式C语言之--结构体对齐详解 原创嵌入式笔记v2020-04-06 23:02:22 引言 结构体作为日常开发中使用最广泛的数据类型之一,其重要性不言而喻 .上一篇我们介绍了结构体的定义, 变量的 ...

  • 为什么有些结构体中会定义一个字节的数组

    有一些Windows结构体是可变长度的,它们通常会有一个固定长度的头部,然后接下来是一个可变长度的数组.当这些结构体被声明的时候,它们通常会被声明为一个只有一个字节元素的数组,如下图所示: 如果我们观 ...

  • C语言之结构体就这样被攻克了!

    「本文目录」 结构体的声明与定义 声明 定义 访问结构体成员 初始化结构体 对齐 结构体嵌套 结构体数组 结构体指针 传递结构体信息 传递结构体变量 传递指向结构体变量的指针 动态申请结构体 实战:建 ...

  • C语言之结构体就这样被攻克了!(绝对值得收藏的文章)

    来源 :公众号"TechZone",作者:HarrisWilde 「本文目录」 结构体的声明与定义 声明 定义 访问结构体成员 初始化结构体 对齐 结构体嵌套 结构体数组 结构体指 ...

  • 详解C#中委托,事件与回调函数讲解

    .Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等. "protected vo ...

  • 【C语言核心基础】基本运算、变量、数组、指针、函数、结构体...

    C 语言基础 // 引入头文件.里面包含了重要的 printf. #include <stdio.h> // 入口函数. // 参数一指输入的参数个数,参数二保存了所有参数. // 返回值 ...