Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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 与普通函数调用相比,仍然无法获得回调_C_Pointers_Callback_Function Pointers - Fatal编程技术网

C 与普通函数调用相比,仍然无法获得回调

C 与普通函数调用相比,仍然无法获得回调,c,pointers,callback,function-pointers,C,Pointers,Callback,Function Pointers,我在这里看到了几乎所有流行的回调问题,但仍然不明白为什么在回调中使用函数指针,而不是通过普通函数简单地使用回调。下面是一个流行问题的公认答案(修改) void populate_array(int *array, size_t arraySize, int getNextValue(void)) // Note that, here I use normal function call. { for (size_t i=0; i<arraySize; i+

我在这里看到了几乎所有流行的回调问题,但仍然不明白为什么在回调中使用函数指针,而不是通过普通函数简单地使用回调。下面是一个流行问题的公认答案(修改)

void populate_array(int *array, size_t arraySize,
            int getNextValue(void))  // Note that, here I use normal function call.
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}

int getNextRandomValue(void)
{
    return rand();
}

int main(void)
{
    int myarray[10];
    populate_array(myarray, 10, getNextRandomValue);
    ...
}
void填充数组(int*array,size\t arraySize,

int getNextValue(void))//注意,这里我使用普通函数调用。 { 对于(尺寸i=0;i 这不是函数调用:声明中不能有函数调用。
getNextValue
是指向函数的指针,该函数不带任何参数,并返回使用不同语法声明的
int

考虑这个类比:您可以为指向
int
的指针定义一个新类型,并在函数声明中使用它

typedef int* intptr_t;
void myFunction(intptr_t ptr) {
    ...
}
或者您可以说,
ptr
是指向声明内
int
的指针:

void myFunction(int* ptr) {
    ...
}
同样,在声明中使用函数指针之前,可以先定义它的类型

typedef void generator_t(void);
void populate_array(int *array, size_t arraySize, generator_t getNextValue) {
}
或者,您可以说
getNextValue
是一个函数指针,使用您文章中的替代语法


为函数指针使用
typedef
的一个原因是,当您想要创建函数指针数组时,一致性检查:如果您的库函数使用在该函数声明中定义的函数指针,则需要在您自己的代码中重新创建相同的声明,以创建您想要的指针数组作为指针传递到库。这可能会导致不一致,这些不一致仅在库函数调用时可见,而不是在数组声明时可见,从而使潜在问题更难跟踪。

它们都以相同的方式工作-它们是函数的指针。类似于(在你的
main
的上下文中)
myarray
&myarray
都指向同一个东西。@DrewMcGowen差不多了。
myarray
&myarray
没有指向同一个东西。那么,为什么人们更喜欢
int(*foo)(void)
,而不是
int foo()
@ashish2expert,因为它是1.更明确,2.更接近事实。“注意,这里我使用普通函数调用。”不,它不是普通函数调用!它是一个函数指针,只是使用不同的语法。那么,如果我们可以这样做,为什么要这么做呢above@ashish2expert我应该重复一遍吗?“因为它是1.更显式,2.更接近事实。”@ashish2expert在函数声明外定义了指针类型,这样可以更容易地传递用于在目标库内使用的指针。在声明内不能有函数调用并不完全正确:
#include
void foo(int a[][printf(“Hello,world.\n”)]{}
intmain(void){foo(0);返回0;}
打印“Hello,world”。@EricPostpischil现在这是邪恶的;-)
typedef void generator_t(void);
void populate_array(int *array, size_t arraySize, generator_t getNextValue) {
}