J'admets volontiers que la concision de la formulation utilisée "l'identificateur d'un tableau est une ..." ne couvre pas le cas A[0]. Peut-être d'ailleurs aurais-je dû dire "l'identificateur d'un tableau représente une ..." , mais j'aime bien le "est" qui est plus catégorique.

Le but est d'avoir une formulation exacte mais courte et facile à comprendre et à retenir. Si c'est le cas, le passage à la situation d'une expression plus complexe comme A[0] est naturel et intuitif : Cette expression ne joue t-elle pas également le rôle d'identifier un objet tableau ? Melem a parfaitement compris et exprimé mon point de vue.

Pour le cas "oublié", il n'existe pas. Le propos ne concerne d'ailleurs pas le processus de création/initialisation des objets.
Dans une expression comme char s[] = "..." la chaine "..." ne représente pas un objet tableau mais est une syntaxe commode pour représenter une liste de valeurs d'initialisation (comme le montre Melem avec la forme standard char s[] = {...}).
Quant à la forme char * p = "...", La chaine "..." est bien un tableau (on a accès aux éléments de ce tableau) mais l'expression correspond bien à la règle : c'est l'adresse de son premier élément qui est placé dans p.

c-candide
Un identificateur n'est pas un objet, un identificateur appartient au champ lexical du programme, la Norme en parle dans le § intitulé Lexical elements et dit:...
On n'est pas au même niveau d'abstraction. Le texte de la norme que tu cites nous dit comment écrire un identificateur (ce qui est important mais peu intéressant intellectuellement), mais pas ce qu'il représente.

Mais l'identificateur d'un tableau, en dehors de sizeof et de &, EST un pointeur sur le premier élément du tableau.
donc, on lit bien un identificateur de tableau EST un pointeur.
Tu exprimes la chose de cette façon :
elle est convertie en pointeur vers son premier élément.
Si on lit ceci, on en déduit que c'est devenu un pointeur !

L'ambiguïté est en fait entre les notions d'adresse (désignée comme une "contante pointeur" dans la norme) et d'objet pointeur. Classiquement, on utilise pour les deux, pour simplifier le discours, le terme de pointeur comme on le fait pour des int ou des float en disant 3 est un int et, dans int i; , i est un int. Dans le cas des int, il n'y a pas de problèmes car il n'y a pas "d'interférences" entre un int (valeur ou objet) et un autre type de données. Par contre, il y a des "interférences" entre adresse et tableaux (mais pas entre objet pointeur et tableaux). C'est pourquoi, dans mon post, tu remarqueras que dans la règle (simplifiée certes) telle que je l'ai énoncée, je n'emploie pas le terme pointeur, où il serait ambigu, mais celui d'adresse pour souligner que dans un tel contexte l'identificateur (ou A[0]) n'est pas un objet. Les erreurs commises sont toujours liées à la confusion entre tableau et objet pointeur et sont la conséquence de l'ambiguïté du terme pointeur pour désigner à la fois une adresse et un objet pointeur.

C'est vrai que si on dit "convertie" (en lui donnant le sens d'un cast implicite, on ne va pas inventer une exception supplémentaire) on doit obtenir en C une valeur et non un objet. Pour un débutant, c'est chercher bien loin le fait que c'est une adresse et pas un objet pointeur. Mais on ne peut pas convertir un objet d'un type en un autre mais seulement convertir une valeur d'un type en un autre. Il faut définir alors la "valeur" associée à l'objet tableau (comme j'ai été amené à le faire dans mon tuto).

lazakal
En tout les cas l'évolution des messages (et des clics...) m'amena au tuto de patrick Gonord "Concepts en C"; je le trouve de "haut niveau d'abstraction" et surtout trés bien conçu, Grand Merci P.G.
Merci !