我是C的初学者。 现在我有这样的功能
void mark_function(void *obj, void (*mark_obj)(void *));
据我所知,这是一个void函数,它有两个参数,第一个是void指针, 第二个是带有void参数的另一个void函数。
我尝试了很多方法来调用它,但它似乎无法正常工作,要么让我回到分段false,要么指针类型不一样警告。
那么这个功能究竟意味着什么?应传入哪些参数?以及如何调用它? 有什么帮助吗?
非常感谢!
答案 0 :(得分:1)
让我们先说清楚一点。你有一个名为mark_function
的void函数,它有2个参数。第一个参数是void指针,第二个参数是指向返回void的函数的指针,并将void指针作为参数。让我们创建一个函数,将其作为参数传递给mark_function
。
void param(void *p) {
// function body
}
假设a
和b
是2个无效指针。我不会详细介绍它们的范围,但您需要注意它们:它们必须在它们使用的范围内可用。
然后,mark_function
将被称为:
mark_function(a, param);
在mark_function
内部,您可以拥有类似的内容:
param(b);
,这是对作为参数传递的函数的调用。
长话短说:用作参数的函数指针是为了使需要它们通过调用不同函数来执行不同活动的函数成为可能。指针函数的值只是具有适当签名(返回值和参数列表)的函数的名称。您的函数可以根据需要使用它来调用作为参数提供的函数。
答案 1 :(得分:0)
您应该使用一个指向对象的指针和一个指向合适类型函数的指针来调用该函数。
int my_int;
void mark_function(void *obj, void (*mark_obj)(void *));
void my_func (void *vp)
{
/* Convert vp to a pointer to a real type */
int *ip = vp;
/* Do something with ip or *ip */
}
mark_function (&my_int, my_func);
指向对象(&my_int
)的指针可以安全地转换为void *
并返回相同的类型。保证结果指针与原始指针相同。这允许mark_function()
执行某些任务,而不管指针指向的实际类型。
此类任务的典型示例包括使用调用者提供的自定义比较函数对数组进行排序,或维护链接列表而不知道存储在其中的对象类型,等等。