This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教一个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);

 

请高手指点,谢谢!

  • 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赋值过去就可以了。

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

  • 这是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)是错的。

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

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

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

  • yanzhen fu 说:

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

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

    传入参数是一个,你写了两个!