【发布时间】:2011-09-20 06:03:10
【问题描述】:
我发现了这些工作类型的代码:
hash_init.key = &hash_key_lc;
和
ls->handler = init_connection;
这里hash_key_lc和init_connection都是函数,但是一个是&另一个不是,为什么?
更新
所以它们是一样的,但有什么道理呢??
【问题讨论】:
标签: c function-pointers
我发现了这些工作类型的代码:
hash_init.key = &hash_key_lc;
和
ls->handler = init_connection;
这里hash_key_lc和init_connection都是函数,但是一个是&另一个不是,为什么?
更新
所以它们是一样的,但有什么道理呢??
【问题讨论】:
标签: c function-pointers
参见 C99 第 6.3.2.1 节,第 4 节:
功能指示符是一个 具有函数类型的表达式。 除非它是
sizeof运算符或一元&运算符,一个函数指示符 type ‘‘函数返回type’’是 转换为具有 type ‘‘指向函数返回的指针 类型''。
因此,如果foo 是一个函数,则表达式foo 和&foo 大多可以互换,尤其是
foo == &foo
这类似于数组类型的表达式隐式转换为指针类型的表达式。另外,如果fp 是一个函数指针,你可以在有或没有解引用的情况下调用它,即表达式
(*fp)(42)
和
fp(42)
是等价的。函数调用实际上是根据函数指针(第 6.5.2.2 节第 1 节)而不是函数指示符定义的,即就语言语义而言,第一个示例中的 *fp 将在括号之前隐式转换回 fp已申请。
【讨论】:
function 上的reference/deference 在c 中被视为语言特例,因为function 值得这种特例,它不能被某个value 通过,你只能通过address/reference传递它。
【讨论】:
这与以下问题相同: In C, what is the difference between `&function` and `function` when passed as arguments?
那里接受的答案:
没有区别。为了证据 见C99 specification(部分 6.7.5.3.8)。
"将参数声明为 “函数返回类型”应为 调整为“函数指针” 返回类型'',如 6.3.2.1。”
【讨论】:
*)和指针指针(**)怎么可能没有区别?
void (*)(void)(指向函数的指针)和void(**)(void)(指向函数的指针),而是void(void)(函数)和void (*)(void)。当作为参数传递时,函数将转换为指向函数的指针。
sizeof(void (void)) 应该是什么?)但它是一个有效的类型和有效的声明,那么为什么不使用它呢?我个人更喜欢看到pass(func) 到pass(&func)。