c - 函数指针 - 为什么将结构作为参数传递?

时间:2017-11-13 17:13:36

标签: c function-pointers

我正在阅读下面的程序源代码并尝试理解函数指针。以lwm2m_read_callback_t为例,这是一个函数指针是否正确?是否有一个明显的原因,为什么第四个参数采用指向lwm2m_object_t结构本身的指针?

/*
 * LWM2M Objects
 *
 * For the read callback, if *numDataP is not zero, *dataArrayP is pre-allocated
 * and contains the list of resources to read.
 *
 */

typedef struct _lwm2m_object_t lwm2m_object_t;

typedef uint8_t (*lwm2m_read_callback_t) (uint16_t instanceId, int * numDataP, lwm2m_data_t ** dataArrayP, lwm2m_object_t * objectP);
typedef uint8_t (*lwm2m_discover_callback_t) (uint16_t instanceId, int * numDataP, lwm2m_data_t ** dataArrayP, lwm2m_object_t * objectP);
typedef uint8_t (*lwm2m_write_callback_t) (uint16_t instanceId, int numData, lwm2m_data_t * dataArray, lwm2m_object_t * objectP);
typedef uint8_t (*lwm2m_execute_callback_t) (uint16_t instanceId, uint16_t resourceId, uint8_t * buffer, int length, lwm2m_object_t * objectP);
typedef uint8_t (*lwm2m_create_callback_t) (uint16_t instanceId, int numData, lwm2m_data_t * dataArray, lwm2m_object_t * objectP);
typedef uint8_t (*lwm2m_delete_callback_t) (uint16_t instanceId, lwm2m_object_t * objectP);

struct _lwm2m_object_t
{
    struct _lwm2m_object_t * next;           // for internal use only.
    uint16_t       objID;
    lwm2m_list_t * instanceList;
    lwm2m_read_callback_t     readFunc;
    lwm2m_write_callback_t    writeFunc;
    lwm2m_execute_callback_t  executeFunc;
    lwm2m_create_callback_t   createFunc;
    lwm2m_delete_callback_t   deleteFunc;
    lwm2m_discover_callback_t discoverFunc;
    void * userData;
};


typedef struct _lwm2m_list_t
{
    struct _lwm2m_list_t * next;
    uint16_t    id;
} lwm2m_list_t;

2 个答案:

答案 0 :(得分:1)

这是一种修改结构与初始化结构的函数不同的函数的方法。这样您就可以通过引用修改结构。 在C中,您只能返回一个变量并通过引用传递变量是一种仍然能够修改函数中多个变量的方法。

假设您要修改函数中的2个整数:

Unbalanced or unexpected parenthesis or bracket.

如您所见,这允许您更改我的参考变量。

结构也是如此。

答案 1 :(得分:0)

所有这些typedef函数都说,第四个参数是结构指针类型“lwm2m_object_t”。

显然,当您调用这些函数时,您将传递相应的struct对象作为参数。