【问题标题】:Initializing a function pointer without the '&' operator [duplicate]初始化没有“&”运算符的函数指针[重复]
【发布时间】:2017-12-07 01:42:52
【问题描述】:

我在玩函数指针,但遇到了一些直觉上不符合我对 C 中指针的理解的东西。

看看下面的代码:

include <stdio.h>

void fun(int a) {
    printf("fun, %d!\n", a);

}

void bun(int b) {
    printf("bun, %d!\n", b);
}


int main(){

    void (*fooptr)(int) = &bun;
    void (*blooptr) (int) = fun;

    fooptr(200);
    blooptr(100);

    return 0;
}

如果我像对待 C 中的任何其他指针一样处理函数指针,我应该期望 void (*blooptr) (int) = fun; 触发针对不兼容类型的编译器警告。我的代码编译(静默)并按预期工作。

C 如何让我在没有 &amp; 运算符的情况下初始化函数指针,就像我会做一个常规指针一样,甚至没有编译器警告?这是我不小心得到正确行为的情况之一,尽管我在技术上处于未定义的行为领域?如果有人可以解释为什么这行得通,并且对函数指针的性质有一些了解(参考文献也可以),那就太好了。

我尝试四处寻找这个特定问题,但找不到任何相关内容。似乎有点基本,所以如果它是一个重复,请道歉。

【问题讨论】:

  • 这就像传递数组 - C 保留不一致、令人困惑的权利,并且只需要一个地址运算符'有时':(

标签: c pointers function-pointers


【解决方案1】:

C 中的函数类型自动隐式衰减为函数指针类型(就好像一元 &amp; 运算符被安静地应用了一样)。除了一元 &amp; 运算符和 sizeof 运算符之外,这种衰减发生在所有上下文中。为此

void (*fooptr)(int) = &bun;

void (*fooptr)(int) = bun;

是同一件事的两种不同说法。

【讨论】:

  • 你能扩展这部分吗? “这种衰减发生在除了一元 & 运算符和 sizeof 运算符之外的所有上下文中”
  • @aspen100:这意味着表达式bun在任何地方都被悄悄地解释为(void (*)(int)) bun,除非你做&amp;bun(它不会被解释为&amp;(void (*)(int)) bun)和除非你做@ 987654330@(它不被解释为sizeof (void (*)(int)) bun,而是被解释为sizeof的无效应用)。在所有其他上下文中,bun 等价于(void (*)(int)) bun,与&amp;bun 相同。
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 2016-03-12
  • 2023-03-12
相关资源
最近更新 更多