在C语言中,为什么我可以将函数名称(而不是指针)作为参数传递给函数?

zhenguoli

我已经测试了以下代码:

#include <stdio.h>
void f(void g()) {
    g();
}

void g(void) {
    printf("hello, world\n");
}

int main() {
    f(g);
    return 0;
}

它运作良好。在上面的代码中,为什么在c中我们可以将函数名称g作为参数,而将函数原型作为参数?

在《 K&R》一书中,它说我们可以使用函数指针:所以我可以这样定义函数f

void f(void (*g)()) {
    g();
}
void g(void) {
    printf("hello, world\n");
}

int main() {
    void (*pf)() = g;
    f(pf);
    f(g);   // Here f(g) also works.
    return 0;
}

因此,在第一种f定义形式中,参数原型为void g(),在第二种形式中,参数原型为void (*g)()为什么的两种定义形式f都相同?

而在第二种形式中,参数是指向函数的指针,为什么f(g)还起作用?

来自莫斯科的弗拉德

来自C标准(6.3.2.1左值,数组和函数指示符)

4函数指定符是具有函数类型的表达式。除非它是sizeof运算符(65)或一元&运算符的操作数,否则将类型为“ function returning type”的函数指定转换为类型为“ pointer to function returning type”的表达式

和(6.7.6.3函数声明符(包括原型))

8将参数声明为“函数返回类型”声明调整为“指向函数返回类型的指针”,如6.3.2.1所述。

因此,这些函数声明

void f(void g());

void f(void ( *g )());

声明相同的一个函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将函数名称作为参数传递给mapply?

C ++:为什么我可以将指针值成员变量从const成员函数传递给采用非const指针参数的外部函数?

获取作为参数传递给函数的函数名称

为什么我可以省略函数的参数名称?

将指针传递给char数组作为函数的参数-C

为什么当将一个方法作为参数传递给另一个方法时,为什么我得到“函数名称必须是字符串”

将Struct数组元素作为参数传递给Go语言中的函数

为什么可以将未初始化的变量地址传递给函数的指针参数

为什么将结构传递给函数而不是单独的参数?

在C语言中,为什么某些函数名称前缀为“ _ _”(双下划线)

在C语言中,将字符指针传递给函数并使其指向某处,这是错误的吗?

如何将参数名称作为参数传递给函数

为什么我们将函数作为参数传递给python

为什么可以在C ++中将函数指针作为模板参数传递?

将指针传递给成员函数作为void *函数的参数

当您可以直接将指针传递给C函数时,为什么要使用memcpy()?

将字符串作为参数名称/值对传递给R函数

有什么方法可以将未知类型的数组作为参数传递给C中的函数?

将联合传递给函数无法识别参数名称

为什么将字符串传递给scanf()在C语言中可以正常编译?

为什么我可以在C语言中使用数组而不是结构作为标量?

为什么在这种情况下不能将函数名称作为参数传递?

C ++,为什么可以将rvalue传递给以lvalue引用为参数的函数

如果我们传递Python函数名,究竟将什么作为参数传递?

我可以在没有反射的情况下将setter(而不是值)作为参数传递给函数吗?

C语言上的lint:函数的参数(指针)可以是const。*但是*我正在写传递的指针

函数为什么要在传递给它的参数上使用“运算符的地址”作为指针?

将char指针作为参数传递给函数

如何将指针传递给在 C++ 中作为引用传递参数的函数