考虑以下程序: #include stdio.hvoid 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表达式,因
#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,因此在某种程度上,这两个函数执行相同的操作(必须先定义参数);我现在正在读一本书
The fact that technically this function (
f
) is passed on as a function
pointer (tog1
) is usually of minor interest, […]
所以,我理解的是作者说语义上都是等价的.
但是在调用g1和g2时打印的地址是不同的,其中g2输出f的实际地址.这意味着g1复制了f,这意味着f是按值传递的.这本书错了还是我?我不认为这本书是错的,但地址不同,当然你选择哪一本也很重要.如果有任何区别,在哪种情况下应该优先考虑哪一个?
你错了.每当您认为将函数传递给函数时,实际上是在向它传递指针.
每当一个函数看起来它有一个函数参数时,它实际上都有一个函数指针参数.
现在,在您的一个函数中,您打印指向参数的指针的值,在另一个参数中.除了%p用于void *而不是其他数据指针,尤其是对于函数指针,这意味着你有未定义的行为,有充分的理由期望它们是不同的,特别是在具有共享的架构上数据和指令的地址空间.