VIII. Déclarateurs complexes▲
On a, pour la déclaration des types, à distinguer deux cas :
- Les types « élémentaires » (char, int, float, enum…, struct, union)
- les types « complémentaires » : adresses (d'objets ou de fonctions), fonctions et tableaux
Un type de donnée peut être une combinaison plus ou moins compliquée associant des types « élémentaires » avec des types « complémentaires ». Son écriture et son décodage ne sont pas une chose très aisée. Rappelons l'écriture des types « complémentaires » telle qu'elle a été décrite aux chapitres précédents :
Type adresse Ta |
Type tableau Tt |
|
T * Ta |
T Tt [] |
T Tf ( T1 , T2 , ….) |
Il reste à appliquer les mêmes principes qui ont conduit à cette syntaxe à des déclarations plus complexes.
Quelques exemples :
- Pour déclarer que Ttp est un tableau de pointeurs sur T, on écrira que
Ttp |
est tableau de pointeurs sur T |
Ttp [] |
est pointeur sur T |
(*Ttp [] ) |
est T |
T (*Ttp [] ) |
|
T *Ttp [] |
plus simplement |
- Pour déclarer que Tpt est un pointeur sur un tableau de T, on écrira que :
Tpt |
est pointeur sur tableau de T |
(*Tpt ) |
est tableau de T |
(*Tpt ) [] |
est T |
T (*Tpt ) [] |
- Pour déclarer que T est un tableau de pointeurs sur fonction sans arguments retournant un pointeur sur int, on écrira que :
T |
est tableau de pointeurs sur fonction sans arguments |
T [] |
est pointeur sur fonction sans arguments |
(*T [] ) |
est fonction sans arguments |
(*T [] ) (void) |
est pointeur sur int |
*(*T [] ) (void) |
est int |
int *(*T [] ) (void) |
- Que signifie la déclaration suivante : char *(*(*F) (int)) [] ?
char *(*(*F) (int)) [] |
|
*(*(*F) ( int)) [] |
est char; |
(*(*F) ( int)) [] |
est pointeur sur char; |
(*(*F) ( int)) |
est tableau de pointeurs sur char |
*(*F) ( int) |
idem |
(*F) ( int) |
est pointeur sur tableau de pointeurs sur char |
(*F) |
est fonction d'argument int retournant un pointeur |
*F |
idem |
F |
est pointeur sur fonction d'argument int |