请考虑以下程序:
#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
编译了这个程序,得到了三个警告。 - klutt