[xpert.press] moderne c-programmierung || komplexe typen
TRANSCRIPT
15
Komplexe Typen
Um Typen in komplexen Fällen korrekt zu erkennen, muß man vom Namen ausge-hen, und rechts und links vom Namen befindliche Operatoren gemäß ihrer Rang-reihenfolge interpretieren, dabei von innen nach außen arbeiten, und Paare runderKlammern unterscheiden, ob sie einen Vorrang erzwingen sollen oder aber eineFunktion anzeigen.
extern void ( *signal(int, void(*)(int)) )(int);
signalist eine Funktion, signal(
die ein intund eine Funktions-Adresse (*)()
als Argumente erhält )und eine Adresse *signal
auf eine Funktion, ( *signal() )()die ein int-Argument erhält )(int)
und keinen Rückgabewert hat, void(zurückgibt.
void (*sig)(int);
sigist eine Adresse (*sig)
auf eine Funktion, *sig (die ein int-Argument erhält (int)
und nichts void (zurückgibt.
Mit Hilfe von typedef kann man sich die Sache sehr erleichtern. Besonders, wennein damit vereinbarter Grundtyp Basis für weitere Typvereinbarungen ist.(� 132, 210, 6)
H. Schellong, Moderne C-Programmierung, Xpert.press,DOI 10.1007/978-3-642-40058-2_15, © Springer-Verlag Berlin Heidelberg 2013
116 15 Komplexe Typen
char *cp[3];
cpist ein Array []
aus 3 Elementen des Typs:Adresse auf char: char*
char (*cp)[3];
cpist eine Adresse auf ein Array (*)[]
aus 3 Elementen des Typs: char
char *(*cpa[1])[3];
cpaist ein Array []
aus 1 Element des Typs:Adresse auf ein Array (*)[]
aus 3 Elementen des Typs:Adresse auf char: char*
char *(**cpap)[3]= cpa;
cpa als Array-Name im Adressenkontext repräsentiert die Adresse auf sein erstesElement und hat daher den oben angegebenen Typ.
char *(*fuu(int,int))[3][4];
fuuist eine Funktion fuu( )
mit zwei int-Args, fuu(int,int)die einen Zeiger *fuu
auf ein Array (*fuu )[aus 3x4 )[3][4]
Adressen auf charretourniert: char *( )[
typedef char* (*AA3CP)[3];AA3CP cpa[1];
Siehe oben.