c - 不使用 '&' 运算符初始化函数指针

标签 c pointers function-pointers

我正在摆弄函数指针,并遇到了一些直观上不符合我对 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 如何让我在没有 & 的情况下初始化函数指针运算符,就像我会做一个常规指针一样,甚至没有编译器警告?这是我意外获得正确行为的情况之一,尽管我在技术上处于未定义行为领域?如果有人能够解释为什么这是有效的,并对函数指针的本质有一定的了解(引用文献也可以),那就太好了。

我尝试四处寻找这个具体问题,但找不到任何相关内容。看起来有点基础,所以如果是重复的话,我们深表歉意。

最佳答案

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

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

void (*fooptr)(int) = bun;

是表达同一件事的两种不同方式。

关于c - 不使用 '&' 运算符初始化函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47686276/

相关文章:

c++ - 尝试使用 gettimeofday 以毫秒为单位查找耗时

c - 什么是调度表?我如何在 C 中实现它?

c++ - 将捕获lambda作为函数指针传递

c++ - 了解 union 的内存内容

c++ - 在 C++ 中 reshape Matlab

C编程: How to program for Unicode?

arrays - C - 将元素保存到数组

string - 如何将 D 中的 char* 转换为字符串?

c++ - 我如何使用她的地址/不使用方法名称访问类的虚拟方法

c - 结构体数组中每个元素的 mpi 通信器