Voyons l'exemple suivant:
Ces 3 tableaux 1D peuvent être représentés comme un tableau 2D comme suit:
Voyons un autre exemple:
Ces 3 tableaux 1D ne peuvent pas représenter comme un tableau 2D car les tailles des tableaux sont différentes.
Déclaration de tableau 2D
Type de données nom de tableau[LIGNE] [Col]]
int a [2] [3];
En utilisant le code C ci-dessus, nous pouvons déclarer un entier déployer, un de taille 2 * 3 (2 lignes et 3 colonnes).
char b [3] [2];
En utilisant le code C ci-dessus, nous pouvons déclarer un personnage déployer, b de taille 2 * 3 (3 lignes et 2 colonnes).
Initialisation du tableau 2D
Nous pouvons initialiser pendant la déclaration de manière suivante:
Notez que dans 2 et 4, nous n'avons pas mentionné le 1St indice. Le compilateur C calcule automatiquement le nombre de lignes à partir du nombre d'éléments. Mais le 2nd L'indice doit être spécifié. Les initialisations suivantes ne sont pas valides:
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | //Exemple 1.c #inclure #Define Row 3 #define col 2 int main() int i, j; int a [row] [col] = 1,2, 3,4, 5,6 ; printf ("Les éléments sages en ligne du tableau a sont: \ n"); pour (i = 0; i printf ("Row% d:", i); pour (j = 0; j printf ("% d", a [i] [j]); printf ("\ n"); printf ("\ n \ ncolumn Les éléments sages du tableau a sont: \ n"); pour (i = 0; i printf ("colonne% d:", i); pour (j = 0; j printf ("% d", a [j] [i]); printf ("\ n"); retour 0; |
Dans l'exemple1.C, nous avons déclaré un tableau entier de taille 3 * 2 et initialisé. Pour accéder aux éléments du tableau, nous en utilisons deux pour Loop.
Pour accéder au niveau des lignes, la boucle extérieure est pour les lignes, et la boucle intérieure est destinée aux colonnes.
Pour accéder au niveau des colonnes, la boucle extérieure est pour les colonnes, et la boucle intérieure est destinée aux lignes.
Notez que lorsque nous déclarons un tableau 2D, nous utilisons un [2] [3], ce qui signifie 2 lignes et 3 colonnes. L'indexation du tableau commence à partir de 0. Pour accéder au 2nd rangée et 3rd colonne, nous devons utiliser la notation a [1] [2].
Mappage de mémoire d'un tableau 2D
La vue logique d'un tableau A [3] [2] peut être le suivant:
La mémoire de l'ordinateur est une séquence 1D d'octets. En langue C, un tableau 2D est en mémoire Commande en ligne. Quelques autres langages de programmation (E.g., FORTRAN), il stocke en Ordre de colonne-major en mémoire.
Arithmétique du pointeur d'un tableau 2D
Pour comprendre l'arithmétique du pointeur du tableau 2D, jetez d'abord un œil au tableau 1D.
Considérez un tableau 1D:
Dans un tableau 1D, un est une constante, et sa valeur est l'adresse du 0e Emplacement du tableau A [5]. Valeur de A + 1 est l'adresse du 1St Emplacement du tableau A [5]. A + I est l'adresse du jee Emplacement du tableau.
Si nous incrément un par 1, il est incrémenté par la taille du type de données.
A [1] est équivalent à * (A + 1)
A [2] est équivalent à * (A + 2)
a [i] est équivalent à * (a + i)
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 | // Exemple2.c #inclure #Define Row 3 #define col 2 int main() int a [5] = 10,20,30,40,50; printf ("sizeof (int):% ld \ n \ n", sizeof (int)); printf ("a:% p \ n", a); printf ("a + 1:% p \ n", a + 1); printf ("a + 2:% p \ n \ n", a + 2); printf ("a [1]:% d, * (a + 1):% d \ n", a [1], * (a + 1)); printf ("a [2]:% d, * (a + 2):% d \ n", a [1], * (a + 1)); printf ("a [3]:% d, * (a + 3):% d \ n", a [1], * (a + 1)); retour 0; |
Dans l'exemple2.C, l'adresse mémoire s'affiche en hexadécimal. La différence entre A et A + 1 est 4, ce qui est la taille d'un entier en octets.
Maintenant, considérez un tableau 2D:
b est un pointeur de type: int [] [4] ou int (*) [4]
int [] [4] est une rangée de 4 entiers. Si nous incrément B de 1, il est incrémenté de la taille de la ligne.
b est l'adresse du 0e ligne.
b + 1 est l'adresse du 1St ligne.
b + i est l'adresse de jee ligne.
La taille d'une ligne est: (Nombre de colonnes * sizeof (type de données)) octets
La taille d'une rangée d'un tableau entier B [3] [4] est: 4 * sizeof (int) = 4 * 4 = 16 octets
Une rangée d'un tableau 2D peut être considérée comme un tableau 1D. b est l'adresse du 0e ligne. Alors, nous obtenons ce qui suit
Adresse de B [i] [J]: b + sizeof (type de données) * (nombre de colonne * i + j)
Considérez un tableau 2D: int b [3] [4]
L'adresse de b [2] [1] est : b + sizeof (int) * (4 * 2 + 1)
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // Exemple3.c #inclure #Define Row 3 #define col 4 int main() int i, j; int b [row] [col] = 10,20,30,40, 50,60,70,80, 90,100,110,120 ; printf ("sizeof (int):% ld \ n", sizeof (int)); printf ("taille d'une ligne:% ld \ n", col * sizeof (int)); printf ("b:% p \ n", b); printf ("b + 1:% p \ n", b + 1); printf ("b + 2:% p \ n", b + 2); printf ("* b:% p \ n", * b); printf ("* b + 1:% p \ n", * b + 1); printf ("* b + 2:% p \ n", * b + 2); printf ("b [0] [0]:% d ** b:% d \ n", b [0] [0], ** b); printf ("b [0] [1]:% d * (* b + 1):% d \ n", b [0] [1], * (* b + 1)); printf ("b [0] [2]:% d * (* b + 2):% d \ n", b [0] [2], * (* b + 2)); printf ("b [1] [0]:% d * (* (b + 1)):% d \ n", b [1] [0], * (* (b + 1))); printf ("b [1] [1]:% d * (* (b + 1) +1):% d \ n", b [1] [1], * (* (b + 1) +1) )); retour 0; |
Dans l'exemple3.C, nous avons vu que la taille d'une rangée est de 16 en notation décimale. La différence entre B + 1 et B est de 10 en hexadécimal. 10 en hexadécimal équivaut à 16 en décimal.
Conclusion
Donc, dans cet article, nous avons appris sur
Maintenant, nous pouvons utiliser un tableau 2D dans notre programme C,
Les références
Le crédit pour certaines idées dans ce travail a été inspiré par le cours, les pointeurs et les tableaux 2D, par Palash Dey Department of Computer Science & Engg. Institut indien de technologie Kharagpur