精华内容
下载资源
问答
  • 结构体函数指针

    2019-06-02 09:26:46
    函数指针的定义 一般的函数指针可以这么定义: int(*func)(int,int); 表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数: int add(int x,int y) { return x+y; }...

    函数指针的定义

    一般的函数指针可以这么定义:

    int(*func)(int,int);

    表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数:

        int add(int x,int y)
        {
            return x+y;
        }
    


    那么在实际使用指针func时可以这样实现:

    func=&add; //指针赋值,或者func=add; add与&add意义相同
    
    printf("func(3,4)=%d\n",func(3,4));

    结构体中包含函数指针

    其实在结构体中,也可以像一般变量一样,包含函数指针变量.下面是一种简单的实现.

    #include <stdio.h>  
    struct TEST  
    {  
    	int x,y;  
    	int (*func)(int,int); //函数指针  
    };  
      
    int add1(int x,int y)  
    {  
    	return x*y;  
    }  
      
    int add2(int x,int y)  
    {  
    	return x+y;  
    }  
      
    void main()  
    {  
    	struct TEST test;  
    	test.func=add2; //结构体函数指针赋值  
    	//test.func=&add2; //结构体函数指针赋值  
    	printf("func(3,4)=%d\n",test.func(3,4));  
    	test.func=add1;  
    	printf("func(3,4)=%d\n",test.func(3,4));  
    }  
      
    /* 
    输出: 
    func(3,4)=7 
    func(3,4)=12 
    */  
    


    C语言中,如何在结构体中实现函数的功能?把结构体做成和类相似,让他的内部有属性,也有方法
    这样的结构体一般称为协议类,提供参考:

    #include <stdio.h>  
      
    typedef struct  
    {  
    int a;  
    void (*pshow)(int);  
    }TMP;  
      
    void func(TMP *tmp)  
    {  
        if(tmp->a >10)//如果a>10,则执行回调函数。  
        {  
            (tmp->pshow)(tmp->a);  
        }  
    }  
      
    void show(int a)  
    {  
        printf("a的值是%d\n",a);  
    }  
      
    void main()  
    {  
        TMP test;  
        test.a = 11;  
        test.pshow = show;  
        func(&test);  
    }  
    


    结构体函数指针赋值

    一般使用如下方式给结构体的函数指针赋值,这也是linux内核中使用的方式:

    #include <stdio.h>  
      
    typedef struct  
    {  
    int a;  
    void (*pshow)(int);  
    }TMP;  
      
    void func(TMP *tmp)  
    {  
        if(tmp->a >10)//如果a>10,则执行回调函数。  
        {  
            (tmp->pshow)(tmp->a);  
        }  
    }  
      
    void show(int a)  
    {  
        printf("a的值是%d\n",a);  
    }  
      
    void main()  
    {  
        TMP test;  
        test.a = 11;  
        test.pshow = show;  
        func(&test);  
    }  
    


    原文:https://blog.csdn.net/Sophisticated_/article/details/82993051 
     

    展开全文
  • C语言结构体封装函数指针 C语言结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等基本类型组成的。例如,在校学生有姓名、年龄、身高、成绩等属性,学了...

     

    C语言结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等基本类型组成的。例如,在校学生有姓名、年龄、身高、成绩等属性,学了结构体后,我们就不需要再定义多个变量了,将它们都放到结构体中即可,如图所示:
    在这里插入图片描述

    API封装方法

    那么我们怎么用C语言的结构体来封装函数API呢?
    首先看看C++和C的区别及方法:

    C++类

    C++语言类中可以封装函数,体现了模块操做的整体性,下面代码便是C++语言对某个函数的封装,这样操作便于调用。

    lass MarlinSerial //: public Stream
    {
      public:
        MarlinSerial();
        void begin(long);
        void end();
        int peek(void);
        int read(void);
        void flush(void);
    }
    
    • 调用方法:
    MarlinSerial MSerial; //实例化一个对象
    MSerial.begin(9600);//设置串口的波特率为9600
    
    • 这样便对对串口操作函数进行了模块化封装,代码结构清晰。

    C语言结构体

    那么C语言是否可以实现这种方式呢?C语言结构体不能直接封装函数,但可以通过封装函数指针的方式来实现,具体方法如下:
    首先看看结构体的基本使用及定义方法,也就是上面所说的定义不同的数据类型,如下所示:

    typedef struct
    {
        uint8_t     uart1;
        uint32_t    uart2;
        uint8_t     uart3;
        uint8_t     uart4;
        
        uint16_t     channel;
        
    }serial_t;
    
    • 函数封装方法如下,首先比如我们有如下几个函数
    void hs_register_usart_callback(uint8_t usart_x,void (*ptr)(uint8_t*,uint16_t),uint16_t BuffSize,uint8_t reMode);
    void usart_config(uint8_t usart_x,uint32_t baud_rate);
    void hs_usart_printf(uint8_t usart_x, const char *Data,...);
    void hs_usart_sendHex(uint8_t usart_x,uint8_t *data,uint16_t len);
    
    • 那么要想封装这结果函数,结构体封装就如下所示(其中函数指针名称可自定义):
    ypedef struct
    {
        uint8_t uart1;
        uint8_t uart2;
        uint8_t uart3;
        uint8_t uart4;
        uint8_t channel;//自定义数据
        
        void (*config)(uint8_t usart_x,uint32_t baud_rate);
        void (*register_callback)(uint8_t usart_x,void (*ptr)(uint8_t*,uint16_t),uint16_t BuffSize,uint8_t reMode);
        void (*print)(uint8_t usart_x, const char *Data,...);
        void (*sendHex)(uint8_t usart_x,uint8_t *data,uint16_t len);
    }serial_t;/*API 操作结构体*/
    
    • 然后申明一下就可以了,如下:
    serial_t serial;
    
    • 然后在名称后面加一点就可以调用对应的函数了。如下图所示:

    在这里插入图片描述
    注意:经过这两步,虽然能直接调用不报错,但是是否考虑过它们之间存在着怎样的联系?很明显是没有的,所以还需要进行最重要的一步,也就是实例化:

    /*API 函数初始化*/
    serial_t serial =
    {
        .uart1 = 0,
        .uart2 = 1,
        .uart3 = 2,
        .uart4 = 3,
        .config = usart_config,
        .register_callback = hs_register_usart_callback,
        .print = hs_usart_printf,
        .sendHex = hs_usart_sendHex,
    };
    
    • 这里也就是对结构体取个别名,然后在里面进行对应的赋值和定义,这里“.”后面的名字要和结构体里面“*”后面的一一对应。而”=”后面就是对应底层的函数名称,而uart1这几个直接赋的值,因为他们是结构体内的变量,后面直接调用serial.uart1,就等于是直接赋值0.
      而函数的封装,这里就相当于起一个链接的作用,将结构体内和函数链接起来,我的理解是这样。
    展开全文
  • C语言结构体函数指针
    结构体所占的字节数:大于或者等于所有成员所占的字节的总和,并且是占字节最大成员所占字节数的整数倍
    结构体只能声明变量,不能声明函数,可以用函数指针
    函数指针定义:返回值(*函数指针名)(形参)
    #include "stdafx.h"
    
    struct Student
    {
    	short age;     //2个字节
    	char gender;   //1个字节
    	int score1;     //4个字节
    	double score2;  //8个字节
    	void(*study)();
    	double(*totalScore) (int,double);  //定义函数指针
    };
    
    double calSumScore(int score1, double score2) {
    	return score1 + score2;
    }
    
    void mustStudyHard() {
    	printf("We must study hard!\n");
    }
    
    int main() {
    	//struct关键字不能省去
    	struct Student student = {18,'f',99,99.5};
    	student.totalScore = &calSumScore;  //结构体中定义的函数指针指向具体的函数
    	student.study = &mustStudyHard;
    	student.study(); //调用
    	printf("totalScore=%.2f\n", student.totalScore(student.score1, student.score2)); //调用
    	printf("年龄:%hd,所占字节:%d\n",student.age,sizeof(student.age));
    	printf("性别:%c,所占字节:%d\n",student.gender, sizeof(student.gender));
    	printf("分数:%d,所占字节:%d\n",student.score1, sizeof(student.score1));
    	printf("结构体占:%d个字节\n",sizeof(student));
    
    	//结构体指针,指针指向student这个变量
    	struct Student* stu = &student;
    	stu->score1 = 80;
    	stu->score2 = 86.4;
    	printf("totalScore=%.2f\n", stu->totalScore(stu->score1, stu->score2));
    	return 0;
    }


    展开全文
  • 结构体函数指针的高级封装应用

    分层设计考虑

    作用:降低对底层应用程序的高耦合度

    示例:

    #include "mac.h"
    typedef struct _phy_t{
        char channel;
        char snd_fail_count;
        char *name;
        char open_flag;
    
        void (*init)(void);
        int (*send_packet)(struct _phy_t phy, u8 *pdata, u8 len, u16 waitms);
        void (*recieve_packet)(u8 *data, u8 len, u16 waitms);
    
        rt_sem_t send_sem;
        rt_mq_t  send_mq;
        u8 recvbuff[DEFAULT_PACKET_LEN];
    }phy_t;
    
    用法一:
    extern phy_t *phy_1, *phy_2;   //变量可供所有文件使用(只需包含该头文件)
    /*
        需要在include "mac.c"定义一下变量
            phy_t *phy_1, *phy_2;
    */
    在实际使用 时需要分配内存大小在:
    int main(){
        phy_1 = (phy_t *)malloc(sizeof(phy_t));  //分配空间,否则**只占用四字节大小**内存<但不可使用>
        phy_2 = (phy_t *)malloc(sizeof)(phy_t);
    
        phy_1->init = si4463_init;
        /*
           (* phy_1->init)(void);   //直接进行解引用
        */
    
    }
    用法二:
    extern phy_t phy_1, phy_2;   //变量可供所有文件使用(只需包含该头文件)
    /*
        需要在include "mac.c"定义一下变量,直接为变量分配内存大小
            phy_t phy_1, phy_2;
    */
    在实际使用 时直接使用即可:
    int main(){
        phy_1.init = si4463_init;
        /*
           (* phy_1.init)(void);   //直接进行解引用
        */
    
    }
    展开全文
  • 结构体函数指针

    2015-11-17 20:38:54
    结构体的定义+函数指针
  • 利用跳转结构体函数指针实现多级菜单 1、首先定义一个机构体如下 typedef struct { unsigned char current; unsigned chaup;//上键 unsigned chadown;//下键 unsigned chaenter;//确认键 void (*current_...
  • 结构体函数指针初始化

    千次阅读 2018-08-17 23:01:36
    * 为结构体中的指针数组赋值 */ #include &lt;stdio.h&gt; typedef struct test { void (*p)(void); void (*q)(void); void (*y)(void); }test; void f1(void) { printf("f1\n"); } ...
  • C结构体包含函数指针

    千次阅读 2018-06-14 19:51:57
    #include &lt;stdio.h&gt;#include &lt;malloc.h&gt;struct person { char *name; unsigned int age; void (*speak)(void); void (*eat)(void);...void speak_chinese(void){ printf("...
  • 结构体函数指针实现加减乘除

    千次阅读 2017-07-25 22:28:16
    创建结构体结构体的成员中有一个成员为函数指针,赋值后可指向各个算法的地址; 当输入add 1 2时,指针数组分别指向add,1和2; 随后进行字符串比较,判断进入哪一个算法; 实现:char optr; int(*pf)(int, int)...
  • 结构体函数指针的用法。

    千次阅读 2012-05-13 14:29:02
    *结构体函数指针的用法。 */ #include struct DEMO1 { int (*func)(int, int); }; static int add(int a, int b) { return (a + b); } int main(void) { int (*p)(); struct DEMO1 test; test.func...
  • 结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化一:struct结构体...
  • 02. * 为结构体中的指针数组赋值 03. */ 04. 05.#include 06. 07.typedef struct test 08.{ 09. void (*p)(void); 10. void (*q)(void); 11. void (*y)(void); 12.}test; 13. 14.void f1
  • 在阅读mini2440test 时发现一个不错的操作,通过结构体函数指针进行菜单操作! 如下: struct {  void (*fun)(void); \\为一个函数指针  char *tip; }CmdTip[] = {  { Temp_function, "Please input 1-16...
  • 命名变量结构体函数指针.xlsx
  • //定义函数指针 }; //设置结构体buf对应flag值,函数 struct function buf[] = { { 0x80 ,add}, { 0x81 ,multi}, { 0x82 ,max}, { 0x83 ,min} }; int add( int a, int b) { return a+b; } int ...
  • C++类 给结构体成员 函数指针 赋值

    千次阅读 2016-02-07 15:30:07
    第一种方式传递给变量myStr的函数指针为非静态函数,由于函数中隐含了this,所以函数能够根据this指针区分出不同的对象。 第二种方式的为静态函数,但是你显示的指定了this即void *pObj,使得静态函数仍然能够...
  • 结构体指针作为函数参数时,调用时传递的是指向一个结构体变量的指针(即 结构体变量的地址);结构体变量作为函数参数时,调用时传递的结构体变量本身。 即一个结构体A,当它的指针作为参数传入函数func,那么在...
  • name string //给结构体绑定一个字段,用以说明结构体结构体指针绑定函数的区别 } 2.给结构体绑定函数 func (test Test) function(){ test.name = "结构体" } 3.给结构体指针绑定函数 func(test *Test) ...
  • #include &lt;iostream&gt;#include &lt;string&...结构体函数 结构体作为函数参数、结构体指针作为函数返回值---------------------------------*/struct time{ int hour; int ...
  • 最近在STM的GPIO结构体定义中看到源代码的时候,顺便复习下结构体指针变量的定义及typedef 的使用。 1.结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *...
  • 函数指针&指针函数&结构体调用函数

    千次阅读 2017-07-11 13:57:08
    结构体通过指针调用函数的方法在项目中比较实用:上层函数实现,底层调用从而实现底层通知上层的回调功能!!! 在此说一下函数指针和指针函数这两个概念...再者就是说一下结构体是如何通过函数指针的方式调用函数的。
  •  C语言结构体函数指针封装示例(面向对象思想写法) 1、示例: #include int i, j; struct DATE{ int year; char month; char data; char hour; char min; char sec; }; struct DATE date; struct str_...
  • C 语言学习笔记结构体 02结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之 结构体指针变量一提指针 那可 是 C 语言的核心了有多少学子曾拜倒在指针的脚下单纯的说指针其实并不难但是与其它的结构搭配在一起...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,679
精华内容 91,071
关键字:

结构体存在函数指针