gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:20:11 26 4
gpt4 key购买 nike

我正在阅读下面的程序源代码并尝试理解函数指针。以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;

最佳答案

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

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

void myfunc(int *a, int *b) {
*a = *b + 3;
*b = *a;
}

int main() {
int a = 10;
int b = 5;
myfunc(&a, &b);

return 0;
}

如您所见,这允许您更改我的引用变量。

对于结构也可以做同样的事情。

关于c - 函数指针 - 为什么传递结构作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47269888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com