为什么这个C程序的所有输出都相同?

4
#include<stdio.h>
int main(){
    extern void fun(int);
    void (*p)(int) = fun;
        fun(2);
    (*fun)(2);
    (*p)(2);
    p(2);
    printf("%x %x %x\n",p,fun,*fun);
}

void fun(int i){
    printf("hi %d\n",i);
}  

这里的所有函数调用都产生相同的输出。甚至 p,fun,*fun 都给出了相同的地址。我们该如何解释这个现象?

How can fun and *fun be same?

在古老的时代里,你必须使用 *fun 来解引用函数指针,但 C 语言的作者们决定让 fun 更加明确无误,所以现在可以直接使用 fun(2) 了。 - Paul Tomblin
1个回答

7
因为C语言规范说:
(C99, 6.5.3.2p4) "一元运算符*表示解引用。如果操作数指向一个函数,则结果是一个函数标识符;" fun*fun的值相同,它们等价。

但是,函数包含地址,对吧。*fun 表示该地址上的值。所以,fun 和 *fun 应该是不同的。如果它们相同,那么假设有一个数组 A[10],那么 A 和 *A 也应该是一样的。 - neel
1
这是一个关于函数 * 操作符的特殊规则。对于指针(并假定 A 是一个数组,在应用 * 之前首先转换为指针),*pp 的类型和值是不同的。 - ouah
为什么函数有特殊的异常处理方式? - neel
@neel 因为针对对象指针操作数指定的 * 运算符规则对于函数操作数来说是没有意义的。 - ouah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接