2012-10-27 100 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

相關問題