TI中文支持网
TI专业的中文技术问题搜集分享网站

请教一个C语言中函数指针初始化的问题

请教的内容如下:

先定义一个结构体:

typedef struct {
      void (*CalcCRC16)(void*);
      void (*Check)(void*);
      void (*WriteoneMemory)(void*);
      void (*ReadMemory)(void*);
      void (*WriteMultiMemory)(void*);
      void (*SendStart)(void*);

……

}MODBUS

然后定义一个宏:

#define  MODBUS_DEFAULTS {  \
        (void(*)(void*)) ModbusCalcCRC16,\
        (void(*)(void*)) ModbusCheck,\
        (void(*)(void*)) ModbusWriteOneMemory,\
        (void(*)(void*)) ModbusReadMemory,\
        (void(*)(void*)) ModbusWriteMultiMemory,\
        (void(*)(void*)) ModbusSendStart\
                          }

在主程序中要将这个宏初始化给这个结构体,

请问(void(*)(void*)) 这么多的void和*,  它们的含义到底是什么啊?

 如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点

typedef struct {
      void (*CalcCRC16)(void);
      void (*Check)(void);
      void (*WriteoneMemory)(void);
      void (*ReadMemory)(void);
      void (*WriteMultiMemory)(void);
      void (*SendStart)(void);

 

请高手指点,谢谢!

Young Hu:

typedef struct {

     void (*CalcCRC16)(void*);

     void (*Check)(void*);

     void (*WriteoneMemory)(void*);

     void (*ReadMemory)(void*);

     void (*WriteMultiMemory)(void*);

     void (*SendStart)(void*);

……

}MODBUS

里面全是函数地址。。

#define  MODBUS_DEFAULTS {  \

       (void(*)(void*)) ModbusCalcCRC16,\

       (void(*)(void*)) ModbusCheck,\

       (void(*)(void*)) ModbusWriteOneMemory,\

       (void(*)(void*)) ModbusReadMemory,\

       (void(*)(void*)) ModbusWriteMultiMemory,\

       (void(*)(void*)) ModbusSendStart\

                         }

将函数名(地址)强制类型转换为(void(*)(void*))型的。

初始化,将您写好的函数void (*SendStart)(void*)的名字sendstart赋值过去就可以了。

请教的内容如下:

先定义一个结构体:

typedef struct {
      void (*CalcCRC16)(void*);
      void (*Check)(void*);
      void (*WriteoneMemory)(void*);
      void (*ReadMemory)(void*);
      void (*WriteMultiMemory)(void*);
      void (*SendStart)(void*);

……

}MODBUS

然后定义一个宏:

#define  MODBUS_DEFAULTS {  \
        (void(*)(void*)) ModbusCalcCRC16,\
        (void(*)(void*)) ModbusCheck,\
        (void(*)(void*)) ModbusWriteOneMemory,\
        (void(*)(void*)) ModbusReadMemory,\
        (void(*)(void*)) ModbusWriteMultiMemory,\
        (void(*)(void*)) ModbusSendStart\
                          }

在主程序中要将这个宏初始化给这个结构体,

请问(void(*)(void*)) 这么多的void和*,  它们的含义到底是什么啊?

 如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点

typedef struct {
      void (*CalcCRC16)(void);
      void (*Check)(void);
      void (*WriteoneMemory)(void);
      void (*ReadMemory)(void);
      void (*WriteMultiMemory)(void);
      void (*SendStart)(void);

 

请高手指点,谢谢!

yanzhen fu:

回复 Young Hu:

请问(void(*)(void*))是什么类型,能分析一下吗?如果我定义的是这样的指针:void(*SendStart)(int,int)的话,我又要如何去定义这个初始化强制类型转换呢?为什C语言中查不到相关的说明呢?

请教的内容如下:

先定义一个结构体:

typedef struct {
      void (*CalcCRC16)(void*);
      void (*Check)(void*);
      void (*WriteoneMemory)(void*);
      void (*ReadMemory)(void*);
      void (*WriteMultiMemory)(void*);
      void (*SendStart)(void*);

……

}MODBUS

然后定义一个宏:

#define  MODBUS_DEFAULTS {  \
        (void(*)(void*)) ModbusCalcCRC16,\
        (void(*)(void*)) ModbusCheck,\
        (void(*)(void*)) ModbusWriteOneMemory,\
        (void(*)(void*)) ModbusReadMemory,\
        (void(*)(void*)) ModbusWriteMultiMemory,\
        (void(*)(void*)) ModbusSendStart\
                          }

在主程序中要将这个宏初始化给这个结构体,

请问(void(*)(void*)) 这么多的void和*,  它们的含义到底是什么啊?

 如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点

typedef struct {
      void (*CalcCRC16)(void);
      void (*Check)(void);
      void (*WriteoneMemory)(void);
      void (*ReadMemory)(void);
      void (*WriteMultiMemory)(void);
      void (*SendStart)(void);

 

请高手指点,谢谢!

Young Hu:

回复 yanzhen fu:

这是C语言的问题了,估计在一些专门介绍指针的数据中会介绍。不过可以自己分析嘛。

首先,void*可以指向任何类型的数据,比如float, char等等,这样就增加了函数的灵活性。

(void(*)(void*))类型的函数,传入参数为指向任何类型数据的指针,返回参数为指向任何类型数据的指针。

举个例子

(void(*)(void*))SendStart可以这么去定义

void* SendStart(void*a)

{

   ….//做处理

   return a;

}

调用时:

int a;

int *p;

p=SendStart(&a);

或者

char a;

char *p;

p=SendStart(&a);

void(*SendStart)(int,int)是错的。

请教的内容如下:

先定义一个结构体:

typedef struct {
      void (*CalcCRC16)(void*);
      void (*Check)(void*);
      void (*WriteoneMemory)(void*);
      void (*ReadMemory)(void*);
      void (*WriteMultiMemory)(void*);
      void (*SendStart)(void*);

……

}MODBUS

然后定义一个宏:

#define  MODBUS_DEFAULTS {  \
        (void(*)(void*)) ModbusCalcCRC16,\
        (void(*)(void*)) ModbusCheck,\
        (void(*)(void*)) ModbusWriteOneMemory,\
        (void(*)(void*)) ModbusReadMemory,\
        (void(*)(void*)) ModbusWriteMultiMemory,\
        (void(*)(void*)) ModbusSendStart\
                          }

在主程序中要将这个宏初始化给这个结构体,

请问(void(*)(void*)) 这么多的void和*,  它们的含义到底是什么啊?

 如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点

typedef struct {
      void (*CalcCRC16)(void);
      void (*Check)(void);
      void (*WriteoneMemory)(void);
      void (*ReadMemory)(void);
      void (*WriteMultiMemory)(void);
      void (*SendStart)(void);

 

请高手指点,谢谢!

yanzhen fu:

回复 Young Hu:

为什么说void(*SendStart)(int,int)是错的呢,这可是函数指针的定义方法啊。后面形参只给出类型,不用参数,

前面说的参数是任意类型指针和返回值是任意类型指针我明白了,谢谢!

请教的内容如下:

先定义一个结构体:

typedef struct {
      void (*CalcCRC16)(void*);
      void (*Check)(void*);
      void (*WriteoneMemory)(void*);
      void (*ReadMemory)(void*);
      void (*WriteMultiMemory)(void*);
      void (*SendStart)(void*);

……

}MODBUS

然后定义一个宏:

#define  MODBUS_DEFAULTS {  \
        (void(*)(void*)) ModbusCalcCRC16,\
        (void(*)(void*)) ModbusCheck,\
        (void(*)(void*)) ModbusWriteOneMemory,\
        (void(*)(void*)) ModbusReadMemory,\
        (void(*)(void*)) ModbusWriteMultiMemory,\
        (void(*)(void*)) ModbusSendStart\
                          }

在主程序中要将这个宏初始化给这个结构体,

请问(void(*)(void*)) 这么多的void和*,  它们的含义到底是什么啊?

 如果前面的结构体是这样的,下面的初始化又要如何啊?请高手指点

typedef struct {
      void (*CalcCRC16)(void);
      void (*Check)(void);
      void (*WriteoneMemory)(void);
      void (*ReadMemory)(void);
      void (*WriteMultiMemory)(void);
      void (*SendStart)(void);

 

请高手指点,谢谢!

yanzhen fu:

回复 yanzhen fu:

我现在要问的是,如果我前面定义了一个带型参的参函数时,在初始化时,我又要怎样去定义一个函数指针?谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » 请教一个C语言中函数指针初始化的问题
分享到: 更多 (0)