Pourquoi l’indexation dans un tableau de démarrage avec zéro en C et non avec 1 ?
Réponses
Trop de publicités?En C, le nom d'un tableau est essentiellement un pointeur, une référence à un emplacement de la mémoire, et donc l'expression de la matrice de[n] fait référence à un emplacement de la mémoire n-éléments à l'écart de l'élément de départ. Cela signifie que l'indice est utilisé comme un décalage. Le premier élément de la matrice est exactement contenues dans l'emplacement de mémoire que le tableau se réfère (0 éléments de loin), de sorte qu'il devrait être notée en tant que tableau[0].
pour plus d'info:
http://developeronline.blogspot.com/2008/04/why-array-index-should-start-from-0.html
Cette question a été publié plus d'un an, mais voilà...
Sur les raisons ci-dessus
Alors que Dijkstra, l'article a un sens d'un point de vue mathématique, il n'est pas pertinent quand il s'agit de la programmation.
La décision prise par la spécification du langage et du compilateur-designers basée sur la décision prise par le système informatique, les concepteurs de commencer à compter à 0.
La raison probable
Citant un Plaidoyer pour la Paix par Danny Cohen.
Pour toute base b, le premier b^N entiers non négatifs sont représentés par exactement N chiffres (y compris les zéros non significatifs) que si la numérotation commence à 0.
Cela peut être testé assez facilement. En base 2, prendre en 2^3 = 8
Le 8e numéro est:
- 8 (binaire: 1000) si l'on commence à compter à 1
- 7 (binaire: 111) si l'on commence à compter à partir de 0
111
peuvent être représentées à l'aide d' 3
bits, alors que 1000
exigera un supplément de bits (4 bits).
Pourquoi est-ce pertinent
Adresses de mémoire d'ordinateur ont 2^N
des cellules traitées par N
bits. Maintenant, si on commence à compter à 1, 2^N
de cellules besoin d' N+1
lignes d'adresse. L'extra-bit est nécessaire pour accéder à exactement 1 adresse. (1000
dans le cas ci-dessus.). Une autre solution serait de laisser la dernière adresse inaccessible, et d'utiliser N
lignes d'adresse.
Les deux sont sous-optimal solutions, par rapport à nombre de départ à 0, ce qui permettrait de garder toutes les adresses accessibles, en utilisant exactement N
lignes d'adresse!
Conclusion
La décision de commencer à compter à l' 0
, a imprégné tous les systèmes numériques, y compris les logiciels en cours d'exécution sur eux, parce qu'il rend plus simple pour le code de traduire ce que le système sous-jacent peut interpréter. S'il n'en était pas ainsi, il y aurait un inutile opération de traduction entre la machine et le programmeur, pour chaque tableau. Il rend la compilation plus facile.
Citant le papier:
Vous pourriez être intéressé par un article de Dijkstra en ce qui concerne exactement cette rubrique.
Parce que 0 est à quelle distance du pointeur à la tête de la matrice de la matrice du premier élément.
Considérer:
int foo[5] = {1,2,3,4,5};
Pour accéder à 0 nous faisons:
foo[0]
Mais toto se décompose à un pointeur, et le au-dessus de l'accès a l'analogue de l'arithmétique des pointeurs façon d'y accéder
*(foo + 0)
Ces jours-ci de l'arithmétique des pointeurs n'est pas utilisé comme souvent. Chemin du retour quand bien même, c'était un moyen pratique de prendre une adresse et se déplacer X "services de renseignements" à l'écart de ce point de départ. Bien sûr, si vous voulait juste rester là où vous êtes, vous venez d'ajouter de 0!