Wikipedia affirme que l’opérateur []
précède l’opérateur *
dans l’évaluation.
Alors pourquoi l’énoncé suivant:
char *a[3];
déclarer un tableau de pointeurs de 3 caractères, plutôt qu’un pointeur sur un tableau de 3 caractères selon la priorité de l’opérateur?
Parce que, comme le dit Wikipedia, []
a une priorité plus élevée que *
?
Lors du traitement de la déclaration, le a[3]
est traité comme un “tableau de 3” avant que vous ne traitiez le *
.
Pour déclarer un pointeur sur un tableau de trois caractères, vous devez utiliser des parenthèses pour remplacer la priorité par défaut:
char (*a)[3];
Maintenant, les parenthèses ont priorité sur le tableau.
Voici la grammaire d’un déclarant tirée de la norme (§ 6.7.5):
déclarant : pointeur opt déclarateur direct déclarant direct : identifiant(
déclarant)
déclarateur direct[
type-qualifier-list opt affect-expression- opt]
déclarateur direct[ static
liste-qualificatif-type-[ static
- opt -expression-assignation]
déclarateur direct[
expression-assignationstatic
type-qualifier-liste]
déclarant direct[
type-qualifier-list opt* ]
déclarateur direct(
liste de types de parameters)
déclarant direct(
ident-list opt)
pointeur :*
type-qualifier-list opt*
type-qualifier-list pointeur opt type-qualifier-list : qualificatif de type type-qualifier-list type-qualifier liste de type de paramètre : liste de parameters liste de parameters, ...
liste de parameters : déclaration de paramètre liste de parameters,
déclaration de parameters déclaration de paramètre : déclaration-spécificateurs déclarateur spécificateurs de déclaration abstract-declarator opt liste d'identifiant : identifiant identifiant-liste,
identifiant
Comme vous pouvez le constater, []
et ()
se lient au déclarateur avant *
. Prenez la déclaration
int *a[N];
Le déclarant est *a[N]
, ce qui correspond au modèle de déclaration-indicateur direct du pointeur ci- dessus et est donc analysé comme *(a[N])
. Par conséquent, a
est un tableau de pointeurs à N éléments.
Pour résumer:
T *a[N] -- declares an N-element array of pointer to T T (*a)[N] -- declares a pointer to an N-element array of T T *f() -- declares a function returning pointer to T T (*f)() -- declares a pointer to a function returning T
Je suis confus sur la question – l’interprétation de la déclaration correspond à la préséance de l’opérateur. Si vous voulez un pointeur sur un tableau, vous devez utiliser des parenthèses pour ‘lier le *
à l’indentifiant’ avant la liaison []
.
char (*a)[3];