使用函数或函数符号指针之间有什么区别吗?
考虑以下程序:
#include <stdio.h> void f() {} void g1(void fun(void)) { printf("%pn",&fun); } void g2(void (*fun)(void)) { printf("%pn",fun); } int main(void) { g1(f); g2(&f); printf("%pn",&f); return 0; } 由于C11没有lambda表达式,因此无法将文字函数作为参数传递给g1或g2,因此在某种程度上,这两个函数执行相同的操作(必须先定义参数);我现在正在读一本书
所以,我理解的是作者说语义上都是等价的. 但是在调用g1和g2时打印的地址是不同的,其中g2输出f的实际地址.这意味着g1复制了f,这意味着f是按值传递的.这本书错了还是我?我不认为这本书是错的,但地址不同,当然你选择哪一本也很重要.如果有任何区别,在哪种情况下应该优先考虑哪一个? 解决方法
你错了.
每当您认为将函数传递给函数时,实际上是在向它传递指针. 现在,在您的一个函数中,您打印指向参数的指针的值,在另一个参数中.除了%p用于void *而不是其他数据指针,尤其是对于函数指针,这意味着你有未定义的行为,有充分的理由期望它们是不同的,特别是在具有共享的架构上数据和指令的地址空间. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |