加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:21:17 所属栏目:百科 来源:网络整理
导读:考虑以下程序: #include stdio.hvoid 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表达式,因此无法将文字函
考虑以下程序:

#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,因此在某种程度上,这两个函数执行相同的操作(必须先定义参数);我现在正在读一本书

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 *而不是其他数据指针,尤其是对于函数指针,这意味着你有未定义的行为,有充分的理由期望它们是不同的,特别是在具有共享的架构上数据和指令的地址空间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读