c中的回调和c中的指针
Posted
技术标签:
【中文标题】c中的回调和c中的指针【英文标题】:Callbacks in c and pointers in c 【发布时间】:2022-01-10 13:57:57 【问题描述】:我的任务是创建一个函数,该函数使用 2 个给定的签名通过回调汇总数组和列表元素(int 类型):
typedef void (* callback )( void * ctx , int * value );
void arrayForeach ( void * ctx , callback func , int * arr , int n );
我不知道如何在这里使用函数指针,所以我不知道该怎么做。请帮我写这个简单的代码,解释一下什么是回调。
【问题讨论】:
到底是什么问题?您应该知道如何调用函数(通过函数指针来调用并没有什么不同) 对于数组的每个元素,您应该使用参数ctx
和value
调用函数。
callback
是一个类型(如int
或double
)。 callback func
声明参数变量func
的类型为callback
。由于它是指向函数的指针,因此您可以像任何其他函数一样调用它,并使用合适的参数:func(some_ctx, pointer_to_some_value)
【参考方案1】:
/* caller must check if arr[0] to arr[n-1] is a valid array or part of an array */
void arrayForEach(int ctx, callback func, int * arr, int n)
for (int i = 0; i < n; i++)
func(ctx, &arr[i]); // missed the pointer form
/* you could also use (*func)(ctx, &arr[i]); */
【讨论】:
请不要鼓励cargo cult programming。而且我怀疑像 OP 这样的初学者知道__STD_NO_VLA__
是什么,如何搜索它,或者static n
在数组声明中的含义,所以它可能会让初学者感到困惑而不是帮助。请花一些时间阅读how to write good answers。
好吧,真的不能在不崩溃的情况下对被调用者进行绑定检查。所以最好发出警告。
函数参数声明为int arr[static n]
不是 VLA。
只是一个意见,但是C23会尝试删除K&R C函数定义,所以最好在左边有边界。
我应该使用#if (__STDC_VERSION__ == 199901L)||(__STDC_VERSION__ == 201112L)||(__STDC_VERSION__== 201710L)
。以上是关于c中的回调和c中的指针的主要内容,如果未能解决你的问题,请参考以下文章