Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中调用具有Void参数的Void函数_C - Fatal编程技术网

如何在C中调用具有Void参数的Void函数

如何在C中调用具有Void参数的Void函数,c,C,我是C语言的初学者。 现在我有一个这样的函数 void mark_function(void *obj, void (*mark_obj)(void *)); 据我所知,这是一个void函数,它有两个参数,第一个是void指针, 第二个是另一个带有void参数的void函数 我尝试了很多方法来调用它,但它似乎不能正常工作,要么给我返回分段错误,要么给我指针类型不相同的警告 那么这个函数的确切含义是什么呢?应该传入哪些参数?怎么称呼它? 有什么帮助吗 非常感谢 让我们先说清楚一点。您有一个voi

我是C语言的初学者。 现在我有一个这样的函数

void mark_function(void *obj, void (*mark_obj)(void *));
据我所知,这是一个void函数,它有两个参数,第一个是void指针, 第二个是另一个带有void参数的void函数

我尝试了很多方法来调用它,但它似乎不能正常工作,要么给我返回分段错误,要么给我指针类型不相同的警告

那么这个函数的确切含义是什么呢?应该传入哪些参数?怎么称呼它? 有什么帮助吗


非常感谢

让我们先说清楚一点。您有一个void函数,名为
mark\u function
,它接受两个参数。第一个参数是void指针,第二个参数是指向返回void并将void指针作为参数的函数的指针。让我们创建一个函数,该函数将作为参数传递给
mark\u函数

void param(void *p) {
    // function body
}
假设
a
b
是两个空指针。我不会详细介绍它们的范围,但您需要注意:它们必须在使用的范围内可用。 然后,
mark_函数
将被调用为:

mark_function(a, param);
mark_函数
body中,您可以有如下内容:

param(b);
,它是对作为参数传递的函数的调用



长话短说:用作参数的函数指针旨在使函数能够通过调用不同的函数来执行不同的活动。指针函数的值只是具有适当签名(返回值和参数列表)的函数的名称。您的函数可以根据需要使用它来调用作为参数提供的函数。

您应该使用一个指向对象的指针和一个指向适当类型函数的指针来调用函数

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()
执行某些任务,而不管指针指向的实际类型如何


此类任务的典型示例包括使用调用者提供的自定义比较函数对数组进行排序,或在不知道存储在其中的对象类型的情况下维护链表等等。

显示您试图如何调用它。这是查看错误的最简单方法。它看起来像一个指向函数的指针,该函数使用
void
指针并返回
void
。这不是一个“void函数”。这是一个没有返回值的函数。它接受两个参数:第一个是任何类型(
void
)的指针(
*obj
),另一个是指向没有返回值的函数(
void(*mark_obj)
)的指针,它接受任何类型(
(void*)
)的指针。@FatalError我尝试了void mark_函数(head,mark_link_list(start));哪个head和start是不同链接列表的两个begin节点。不要将参数传递给函数指针,只需传递
mark\u函数(head,mark\u link\u list)
。(稍后通过指针调用函数时,将提供相应的参数。)如果函数签名不匹配,编译器将告诉您。