2017-02-10 32 views
-2

考慮的聲明以下哪個函數調用是有效的?

char first (int (*) (char, float)) ; 

int second(char, float); 

下列哪個函數調用的是有效的?

A)first (*second);

B)first (&second);

C)first (second);

d)以上都不

任何一個可以請解釋我這個代碼?

+0

https://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work – Ryan

+10

什麼其他功課的問題嗎?那麼我們都可以去酒吧 –

+3

爲什麼不問你的編譯器 – pm100

回答

3

這三個調用都是有效的。

按照C標準(6.3.2.1左值,數組和功能指示器)

4所述的功能標誌是具有功能類型的表達式。 除了它是sizeof運算符的操作數65)或一元運算符時,函數返回類型爲' '的函數指示符被轉換爲具有指向函數 的類型'指針的表達式,返回類型''

而且甚至可以寫

first(******second); 

即在表達式中使用的功能指示符是隱式轉換爲指針函數本身除了事實上1案件當它被用作的一個操作數&運算符,其中函數的地址是明確的。

這裏是一個示範項目

#include <stdio.h> 

void g(void (*f)(void)) 
{ 
    f(); 
} 


void f(void) 
{ 
    puts("Hello!"); 
} 

int main(void) 
{ 
    g(**********f); 

    return 0; 
} 

它的輸出是

Hello! 

要考慮到功能first也可以像

char first (int (char, float)) ; 

具有函數參數的聲明函數類型被隱式調整爲指向函數。

+0

所以'F'手段'&F','* F'意味着'&F'當然'&F'手段和'&F' – pm100

+0

@ PM100是的,你是對的。 –

+0

弗拉德,是(標準)說的一種禮貌的方式「指針擺弄與功能將被忽略」? –