当前位置 : 主页 > 编程语言 > c++ >

使用函数或函数符号指针之间有什么区别吗?

来源:互联网 收集:自由互联 发布时间:2021-06-23
考虑以下程序: #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 (to g1) is usually of minor interest, […]

所以,我理解的是作者说语义上都是等价的.

但是在调用g1和g2时打印的地址是不同的,其中g2输出f的实际地址.这意味着g1复制了f,这意味着f是按值传递的.这本书错了还是我?我不认为这本书是错的,但地址不同,当然你选择哪一本也很重要.如果有任何区别,在哪种情况下应该优先考虑哪一个?

你错了.

每当您认为将函数传递给函数时,实际上是在向它传递指针.
每当一个函数看起来它有一个函数参数时,它实际上都有一个函数指针参数.

现在,在您的一个函数中,您打印指向参数的指针的值,在另一个参数中.除了%p用于void *而不是其他数据指针,尤其是对于函数指针,这意味着你有未定义的行为,有充分的理由期望它们是不同的,特别是在具有共享的架构上数据和指令的地址空间.

网友评论