【发布时间】:2018-07-16 22:51:52
【问题描述】:
考虑以下程序:
#include <stdio.h>
void f() {}
void g1(void fun(void)) { printf("%p\n", &fun); }
void g2(void (*fun)(void)) { printf("%p\n", fun); }
int main(void) {
g1(f);
g2(&f);
printf("%p\n", &f);
return 0;
}
由于 C11 没有 lambda 表达式,因此无法将文字函数作为参数传递给 g1 或 g2,所以在某种程度上,这两个函数做同样的事情(你必须定义参数第一的);我现在正在读一本这样说的书
从技术上讲,这个函数 (
f) 是作为函数传递的事实 指针(指向g1)通常是次要的,[...]
所以,我的理解是作者说两者在语义上是等价的。
但是调用g1和g2时打印的地址是不同的,其中g2输出的是f的真实地址。这意味着g1 复制了f,这意味着f 是按值传递的。是书错了还是我错了?我认为这本书没有错,但地址不同,当然选择哪一个很重要。如果有任何区别,在什么情况下应该首选哪一个?
【问题讨论】:
-
请注意,我用
-Wall -Wextra -std=c11 -pedantic编译了这个并收到了三个警告。 -
是的,所有格式不匹配警告:coliru.stacked-crooked.com/a/a80c6b7a990222d9
标签: c function-pointers c11 function-prototypes function-parameter