Suite à ce commentaire , j'ai essayé de google pourquoi, mais mon google-fu a échoué.
Commentaire du lien:
[...] Mais l'important est que les tableaux et les pointeurs sont des choses différentes en C.
En supposant que vous n'utilisez aucune extension de compilateur, vous ne pouvez généralement pas passer un tableau lui-même à une fonction, mais vous pouvez passer un pointeur et indexer un pointeur comme s'il s'agissait d'un tableau.
Vous vous plaignez effectivement que les pointeurs n'ont pas de longueur attachée. Vous devriez vous plaindre du fait que les tableaux ne peuvent pas être passés comme arguments de fonction, ou que les tableaux se dégradent implicitement en pointeurs.
Réponses:
Ma première supposition pour la raison était simplement pour des raisons de performances et d'économie de mémoire, ainsi que pour la facilité d'implémentation du compilateur (en particulier pour le type d'ordinateurs à l'époque où C a été inventé). Le passage d'énormes tableaux "par valeur" semblait avoir un impact énorme sur la pile, il a besoin d'une opération de copie de tableau complète pour chaque appel de fonction, et probablement le compilateur doit être plus intelligent pour sortir le code d'assemblage correct (bien que le dernier point soit discutable) . Il serait également plus difficile de traiter les tableaux alloués dynamiquement de la même manière que les tableaux alloués statiquement (du point de vue de la syntaxe du langage).
EDIT: après avoir lu certaines parties de ce lien , je pense que la vraie raison (et la raison pour laquelle les tableaux dans struct sont traités comme des types de valeur, alors que seuls les tableaux ne sont pas) est la rétrocompatibilité prédécesseur C B . Voici la citation de Dennis Ritchie:
la source
struct Foo { int array[N]; }
peut être passé par valeur. Et le dernier élément concernant le traitement des allocations dynamiques et statiques semble louche (un tableau au sens strict comprend toujours une taille, les concepts unificateurs pour des choses comme l'indexation de tableaux sont des pointeurs couplés à une décomposition de tableau à pointeur), pourriez-vous élaborer?Un mini-ordinateur PDP avec seulement 8 Ko de mémoire ne peut pas allouer une très grande pile. Ainsi, sur une telle machine, il faut être prudent dans la conception (ou l'évolution) d'un langage pour être en mesure de minimiser ce qui doit aller sur la pile pour l'utilisation prévue des appels de sous-programme communs. C est encore utilisé aujourd'hui pour programmer des systèmes embarqués extrêmement limités en mémoire (quelques ko), donc le compromis est généralement bon.
Sur une architecture de processeur qui a très peu de registres, le fait de passer n'importe quel tableau par pointeur plutôt que par valeur permet plus souvent à un registre d'être utilisé comme optimisation d'appel de sous-programme.
la source