Priorité des opérateurs en C Définitions

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-assignation static 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];