[xpert.press] moderne c-programmierung || komplexe typen

2
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 runder Klammern unterscheiden, ob sie einen Vorrang erzwingen sollen oder aber eine Funktion anzeigen. extern void (*signal(int, void(*)(int)) )(int); signal ist eine Funktion, signal( die ein int und 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); sig ist 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, wenn ein 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

Upload: helmut

Post on 11-Dec-2016

217 views

Category:

Documents


5 download

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.