Wirkung von Zeigerdeklarationen
-
Hallo!
Vielleicht einige abgehobene Beispiele, die mir jetzt jedoch begegnet sind und angeblich auch laufen sollen:
a) int (*E)();
b) int *(*F)();
c) int *(*H[N])();Was wird duch diese Zeigerdeklarationen bewirkt?
a) Also ich würde vermuten, dass das gleiche wie *E(); ist, also eine Funktion, die einen Zeiger auf einen int zurückliefert. Aber irgendwie mag mein Compiler das so nicht. Habt ihr ne Ahnung was das ist?
b) Fkt. die einen Zeiger auf einen Zeiger zurückliefert, der auf int zeigt?
c) Fkt. die einen Zeiger auf ein Array von "Int-Zeigern" zurückliefert?
Irgendwie glaube ich nicht recht an meine Vermutungen. Ich hoffe ihr könnt mir helfen!
Dankeschön, aRo
-
aRo schrieb:
a) int (*E)();
b) int *(*F)();
c) int *(*H[N])();"mag er nicht so recht" ist keine ausreichende Fehlerbeschreibung
also:a) Ein Funktionszeiger auf eine Funktion, die ein
int
zurückliefert und eine beliebige(!) Anzahl an Argumenten aufnehmen kann, bzw. mit einer beliebigen Anzahl aufgerufen werden kann. Das gilt übrigens für alle dieser Funktionszeiger. Wenn sie keine Argumente haben sollen, istint (*E)(void);
angesagt.b) Ein Funktionszeiger auf eine Funktion, der (erneut) eine beliebige Anzahl an Argumenten übergeben werden kann und als Resultat einen Zeiger auf
int
liefert.c) Ein Array der Größe N aus Funktionszeigern auf Funktionen, die einen Zeiger auf Int zurückliefern und mit einer beliebigen Anzahl an Argumenten aufgerufen werden können.
-
hey Xantus!
Danke für deine Antwort. Jetzt weiß ich auch, was man dazu lesen muss:
http://openbook.galileocomputing.de/c_von_a_bis_z/c_014_009.htm#RxxobKap014009040028C31F02918Caber zB das hier finde ich verwirrend:
int *(*F)();
Ich finde das könnte man auch so lesen:
Das ist ein Zeiger auf einen Funktionszeiger, der auf eine Funktion zeigt, die einen Int zurück liefert. Wie sähe denn so eine Deklaration aus?Danke!
edit: Das heißt, wenn ich einer funktion keine Parameter gebe, kann sie beliebig viele Parameter aufnehmen?!
-
aber zB das hier finde ich verwirrend: int *(*F)();
Am besten du liest "komplizierte" Deklarationen von Innen nach Aussen
-
aRo schrieb:
edit: Das heißt, wenn ich einer funktion keine Parameter gebe, kann sie beliebig viele Parameter aufnehmen?!
Ja, probier's mal aus, das ist einer der Unterschiede zwischen ANSI C und C++.
In C++ istint myfunc();
gleichbedeutend mitint myfunc(void);
.In ANSI C kannst du eine als
int myfunc(void);
dann auch nur so aufrufen:int myvar = myfunc();
. Wohingegenint myfunc();
z.B. so aufgerufen werden könnteint myvar = myfunc(20, "hallo welt", 3.4f);
. Das solltest du aber vermeiden, denn was bringen dir die Parameter, wenn du nicht drauf zugreifen kannst? Ich hab es einmal für einen sehr häßlichen Hack gebraucht, eben mit jenen Funktionszeigern - ein Callback-Mechanismus, wo ich den Funktionszeiger so generisch wie möglich halten konnte durch diese "schwammige" Signatur der Funktion.Und ja: Von innen nach außen lesen ist hilfreich.