2017-02-10 3 views
-2

Betrachten Sie die ErklärungenWelcher der folgenden Funktionsaufrufe ist gültig?

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

int second(char, float); 

Welche der folgenden Funktionsaufrufe gültig ist?

A) first (*second);

B) first (&second);

C) first (second);

D) keine der oben genannten

Kann jemand mir bitte diesen Code erklären?

+0

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

+10

Was ist die andere Hausaufgabenfrage? Dann können wir alle in die Kneipe gehen –

+3

warum fragen Sie nicht Ihren Compiler – pm100

Antwort

3

Alle drei Anrufe sind gültig.

Gemäß der C Standard (6.3.2.1 Lvalues, Arrays und Funktion Bezeich)

4 Eine Funktion Bezeichner ein Ausdruck ist, der Funktionstyp hat. Außer wenn es der Operand des sizeof operator65) oder des unären & Operators ist, wird ein Funktionsbezeichner mit dem Typ '' function returning type '' in einen Ausdruck mit dem Typ '' Zeiger auf die Funktion Rückgabetyp '' konvertiert

Darüber hinaus können Sie auch schreiben

first(******second); 

, die eine Funktion Bezeichner in Ausdrücken verwendet wird, wird implizit außer in der Tat ein Fall auf die Funktion selbst wenn es als Operand der verwendet wird, um den Zeiger umgewandelt & Operator, an den die Adresse der Funktion explizit übergeben wird.

Hier ist ein demonstratives Programm

#include <stdio.h> 

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


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

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

    return 0; 
} 

Sein Ausgang ist

Hello! 

berücksichtigen, dass die Funktion first auch wie

erklärt werden könnte
char first (int (char, float)) ; 

Ein Funktionsparameter mit einem Der Funktionstyp wird implizit an den Zeiger zur Funktion angepasst.

+0

geupdated, also 'f' bedeutet' & f', '* f' bedeutet' & f' und natürlich '& f' bedeutet' & f' – pm100

+0

@ pm100 Ja, Sie haben Recht. –

+0

Vlad, ist das (der Standard) eine höfliche Art zu sagen, "Zeiger-Fiedeln mit Funktionen wird ignoriert werden"? –

Verwandte Themen