Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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_Function_Function Pointers - Fatal编程技术网

C如何在没有参数的情况下调用函数?

C如何在没有参数的情况下调用函数?,c,function,function-pointers,C,Function,Function Pointers,我正在学习C语言,我很难理解下一行代码是如何工作的: lenv_add_builtin(e, "def", builtin_def); 我不明白的是:第三个参数如何调用没有参数的函数(lenv*,lval*)。我猜它们是作为typedef结构构建的,但我不确定。 这是完整的代码 // function pointer typedef lval*(*lbuiltin)(lenv*, lval*); lval* builtin_def(lenv* e, lval* a){ return

我正在学习C语言,我很难理解下一行代码是如何工作的:

lenv_add_builtin(e, "def", builtin_def);
我不明白的是:第三个参数如何调用没有参数的函数
(lenv*,lval*)
。我猜它们是作为
typedef结构构建的,但我不确定。
这是完整的代码

// function pointer
typedef lval*(*lbuiltin)(lenv*, lval*);

lval* builtin_def(lenv* e, lval* a){
    return lval_sexpr(); 
}

void lenv_add_builtins(lenv* e){
    lenv_add_builtin(e, "def", builtin_def); // ???
}

int main(int argc, char** argv){
    lenv* e = lenv_new(); // constructor
    lenv_add_builtins(e)
    return 0;
}
这条线

lenv_add_builtin(e, "def", builtin_def);
不调用
builtin\u def
。在调用
lenv\u add\u builtin
这一行时,它被用作(指向函数的)指针

lenv_add_builtin(e, "def", builtin_def);

不调用
builtin\u def
。它在调用
lenv\u add\u builtin
时用作(指向函数的)指针,但它没有调用函数;它正在传递一个可用于调用该函数的函数(从技术上讲,是函数指针),此时将提供所需的参数。

它没有调用函数;它正在传递一个可用于调用该函数的函数(从技术上讲,是函数指针),此时将提供所需的参数。

C语言指定函数标识符后面不跟函数调用操作符
()
计算函数的地址(也称为函数指针)

函数指针的典型用途是用作回调。标准示例是
qsort
函数的最后一个参数,它是任意比较函数的地址

void qsort(void *base, size_t nmemb, size_t size,
     int (*compar)(const void *, const void *));

C语言指定函数标识符不后跟函数调用操作符
()
,其计算结果为函数的地址(也称为函数指针)

函数指针的典型用途是用作回调。标准示例是
qsort
函数的最后一个参数,它是任意比较函数的地址

void qsort(void *base, size_t nmemb, size_t size,
     int (*compar)(const void *, const void *));

函数指针:函数没有被调用,只是被传递了。第三个参数不是函数调用;它是一个函数指针。指向的函数将稍后调用。
lenv\u add\u builtin
将创建正确的两个参数。当调用和传递
lenv\u add\u builtin
时,它只是函数的一个内存位置,这样传入并不意味着它立即被调用;它是一个函数指针。指向的函数将稍后调用。
lenv\u add\u builtin
将创建正确的两个参数。当调用和传递
lenv\u add\u builtin
时,它只是函数的一个内存位置,像这样传入并不意味着立即调用它。好的,我明白了,所以任何没有参数的函数都被用作指针(指向函数)?或者我应该这样声明
lenv*(*builtin_def)(int,int)
以使其成为可能。或者正如@Jens在下面的回答中所说的,函数标识符后面没有()作为函数计算pointer@Pompeyo对你还得申报。否则,编译器将不知道变量的类型。Jens说的是真的。好吧,我明白了,所以任何没有参数的函数都被用作(指向函数的)指针?或者我应该这样声明
lenv*(*builtin_def)(int,int)
以使其成为可能。或者正如@Jens在下面的回答中所说的,函数标识符后面没有()作为函数计算pointer@Pompeyo对你还得申报。否则,编译器将不知道变量的类型。延斯说的是真的。