Tous ceux qui lisent ces lignes connaissent probablement ces trois faits essentiels sur le C :
- Lorsque vous mentionnez le nom d'un tableau dans une expression, celle-ci est évaluée (la plupart du temps) comme un pointeur vers le premier élément du tableau.
- L'opérateur de "souscripting de tableau".
[]
fonctionne aussi bien pour les pointeurs que pour les tableaux. - Un paramètre de fonction qui semble être un tableau déclare en fait un pointeur.
Ces trois faits sont absolument centraux pour la gestion des tableaux et des pointeurs en C. Ce ne sont même pas trois faits distincts ; ce sont des facettes liées entre elles d'un concept central. Il n'est pas possible d'effectuer correctement une programmation C, même relativement basique, sans une bonne compréhension de ce concept.
Ma question aujourd'hui est simple, Quel est le nom de ce concept ?
Je suppose que je suis vieux jeu, mais j'ai toujours appelé cela "L'équivalence entre les tableaux et les pointeurs en C", ou "équivalence tableau/pointeur" pour faire court. Mais j'ai appris que l'on ne peut presque pas prononcer ces mots sur l'OS ; ils sont plutôt tabous.
Cela peut sembler être une question abstraite ou philosophique, donc pour la formuler plus concrètement, ce que je cherche est un nom ou une expression simple que je pourrais utiliser dans la phrase "Oui, en raison de _____, l'inscription des tableaux peut être considérée comme un sucre syntaxique pour l'arithmétique des pointeurs", en réponse à, disons, cette question .
(Mais veuillez noter que je suis no à la recherche de réponses à cette question, ou de réponses à la question "Qu'est-ce qui ne va pas avec le mot 'équivalence' ?". Oui, je sais, il peut induire les apprenants en erreur en leur faisant croire que les tableaux et les pointeurs sont en quelque sorte identiques. J'avais cette confusion en tête lorsque j'ai écrit cette entrée de liste FAQ .)
21 votes
Peut-être "array decay" ?
4 votes
L'équivalence est d'environ expressions en utilisant soit le
[]
ou le (unaire)*
opérateurs. De nos jours, la plupart des gens semblent penser en termes de tableaux et de pointeurs. objets ce qui cause la confusion. (car ces objets ne sont pas équivalents) IMHO, IANALL.0 votes
Si l'expression "promotion implicite d'un entier" est quelque chose à voir, je pense que l'expression "conversion implicite d'un tableau" devrait être compréhensible par la plupart.
1 votes
Je sais que l'expression la plus courante est "array decay", mais je ne suis pas un grand fan car "decay" semble involontaire alors que le comportement est intentionnel dans la conception du langage. Personnellement, je préférerais qu'il soit appelé "array erasure" (emprunté au "type erasure" de Java).
0 votes
Je ne pense pas qu'il puisse y avoir une définition ponctuelle à quelque chose qui vient d'un accident de côté pratique pour le langage. Un tableau est un flux de valeurs cohérentes qui se trouvent côte à côte dans la mémoire. Pour y accéder, vous avez besoin de l'adresse où commence le flux, donc d'un pointeur. Mais un pointeur est une variable (un emplacement mémoire) qui peut contenir une adresse mémoire mais pas la mémoire de stockage de la matrice. Les deux sont donc différents et nous avons un problème. Pour gérer cela dans la langue a été utilisé de nombreux "cas spéciaux" le chaos. Peut-être que la définition la plus appropriée aurait pu être Pointeur constant, non modifiable
0 votes
Une "référence implicite par adresse" ?
0 votes
Un "artifice incohérent pour créer la confusion" ?
1 votes
"Syntaxe Tequila Sunrise" ?
0 votes
Si les tableaux et les pointeurs étaient équivalents, alors
char *a = "hi";
ychar a[] = "hi";
signifierait exactement la même chose0 votes
Ouais, "array decay" ressemble plus à quelque chose qui produit un lepton et un quark ou autre, pas un pointeur...
1 votes
Merci pour tous les commentaires et réponses réfléchis. Je les ai résumés dans ma propre "réponse" ci-dessous.
0 votes
Je suis surpris que cette bonne question n'ait pas été "fermée pour cause de tempête". Stackoverflow n'aime généralement pas les questions auxquelles on ne peut pas répondre par "votre problème est ici...", même si c'est la milliardième fois que quelqu'un demande des problèmes de précision en virgule flottante.