0
votes

Pourquoi est-ce que nous déclarons des tableaux de 2D avec une indexation basée sur 1, mais nous accédons à la matrice avec une indexation basée sur la langue C?

`int main()
{
int nums[3][2] = {{1, 2}, {3, 4}, {5, 6}};
printf("%d", nums[2][1]); 
return 0;
}`
Here, if I wanted to access the last element of the array, I would use [2][1] but to name the array, I would use 1 based indexing and use [3][2]. Can someone please explain why?

3 commentaires

Parce que 3 et 2 sont les tailles de l'autre utilisation, ce sont des index.


Dans int Nums [3] [2] , le 3 et 2 ne sont pas des indices, ils sont des longueurs. Ils ne sont pas basés sur 1, car il n'y a pas d'indexation en cours. Ils ne sont pas à base de 0. Ce sont des valeurs de longueur simplement.


Merci les gars. Je comprends ça maintenant.


3 Réponses :


7
votes

Vous êtes déroutant longueur avec index . Pour une gamme de longueur n les index sont 0 via n-1 .

c'est: xxx

signifie x [0] , x [1] et x [2] existe. Il y a 3 entrées numérotées 0 .. 2.

La longueur est uniquement "1 basée" parce que lorsque nous parlons d'une matrice de longueur 1, nous signifions généralement que cela peut contenir une entrée, comme dans ce que c'est comment les humains ont tendance à compter. L'index, cependant, est un décalage à partir du début , car il s'agit vraiment d'un artefact de la manière dont c fonctionne en interne: xxx

où quand vous dites < Code> x [0] Vous dites "Appliquez un décalage zéro au début de la matrice et lisez la valeur" qui se traduit par des termes humains comme "Lire le premier élément", même si les instructions de la machine générées ressemblent à Beaucoup plus comme la première explication.

Autres langues qui implémentent des tableaux basés sur 1 doivent soustraire ce décalage pour lire l'emplacement de mémoire correct. En d'autres termes ils le simulent .


3 commentaires

Oh! Droite. Merci.


@tadman J'étais sur le point d'ajouter le * (x + n) exemple, mais je préfère plutôt cela. Même si vous êtes déjà à 174k Rep ...


@JanchristophTherasa Il n'y en a qu'une explication à une longue ou à une longue explication à la fois!



1
votes

Lorsque vous «nommez» le tableau (le terme approprié est «déclarer / définir»), les chiffres représentent la taille, ou plus précisément le nombre d'éléments dans la matrice.

Lorsque vous accédez à un élément, vous utilisez l'index de l'élément dans le tableau, qui est fondamentalement "jusqu'où, dans le nombre d'éléments, est-il du début de la matrice".

alors le premier élément a indice 0.


0 commentaires

0
votes

Le nombre de crochets d'une déclaration de tableau est le nombre d'éléments, et non l'index du dernier élément. Mais c'est une écart intéressant de la philosophie indiquée de la façon dont les déclarations C fonctionnent.

Kernighan et Ritchie ont décrit comment un déclarant a fourni une sorte d'image d'un identifiant utilisé, dans le langage de programmation C , 1978, page 90:

La déclaration du pointeur px est neuf.

int * px;

est conçu comme un mnémonique; il dit que la combinaison * px est un int , c'est-à-dire si px se produit dans le contexte * px , C'est équivalent à une variable du type int . En effet, la syntaxe de la déclaration d'une variable imite la syntaxe des expressions dans lesquelles la variable pourrait apparaître. Ce raisonnement est utile dans tous les cas impliquant des déclarations compliquées. Par exemple,

double atof (), * dp;

dit que dans une expression atof () et * dp avoir des valeurs de type double .

Ainsi, nous voyons que, dans une déclaration telle que int * p , le * p nous donne une "image" d'une expression p < / code> sera utilisé. Le type réel de l'identifiant est dérivé de l'image: puisque * p est un int , puis p p est un pointeur à un int .

Si nous étions fidèles à ce modèle, alors int x [2] nous dirait que x [2] est un int , donc x doit être un tableau de int et il doit avoir un membre avec index 2, il doit donc s'agir d'une matrice d'au moins 3 int . Au lieu de cela, il a été décidé que le déclarant contiendrait le nombre d'éléments au lieu de l'indice maximum.

Ceci est en grande partie une décision arbitraire: un compilateur peut être conçu pour fonctionner de toute façon. Je ne vois pas que Kernighan et Ritchie discutent de ce choix, dans l'une des éditions de le langage de programmation C . Ils se réfèrent au nombre de "liés" sur la taille de la matrice, mais il n'est pas indiqué pourquoi ils ont été déviés du schéma "Image" pour utiliser un certain nombre d'éléments au lieu d'un exemple d'index. (Curieusement, je ne vois même pas une déclaration que le nombre est le nombre d'éléments. Je vois des exemples qui l'indiquent mais aucune déclaration explicite.)


0 commentaires