2012-10-27 41 views
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都给出了相同的地址。我们如何解释这一点?为什么这个C程序中所有的输出都是一样的?

How can fun and *fun be same? 
+0

在古代,当你不得不使用* fun来取消引用函数指针时,但是C的作者认为乐趣是明确的,并且使它变得如此有趣(2)会起作用吗? –

回答

7

因为C表示:

(C99,6.5.3.2p4) “一元运算符*表示间接如果操作数指向一个函数,其结果是一个功能指示符;”。

fun*fun具有与它们相同的值。

+0

但有趣的包含功能的地址,正确。所以* fun意味着该地址的价值。所以有趣和*乐趣应该是不同的。如果不是,比如我有一个数组A [10],那么A和* A也应该是相同的。 – neel

+1

这是函数'*'运算符的特殊规则。对于指针(并且假设'A'是一个数组,它首先在应用'*之前转换为一个指针),'* p'和'p'的类型和值是不同的。 – ouah

+0

为什么它是功能的特殊例外。 – neel

相关问题