Zobaczmy następujący przykład:
Te 3 tablice 1D można reprezentować jako tablicę 2D w następujący sposób:
Zobaczmy inny przykład:
Te 3 tablice 1D nie mogą być reprezentowane jako tablica 2D, ponieważ rozmiary tablic są różne.
Deklaracja tablicy 2D
typ danych nazwa tablicy[[[WIERSZ] [PRZEŁĘCZ]
int a [2] [3];
Korzystając z powyższego kodu C, możemy zadeklarować liczba całkowita szyk, A wielkościowy 2*3 (2 rzędy i 3 kolumny).
char b [3] [2];
Korzystając z powyższego kodu C, możemy zadeklarować postać szyk, B wielkościowy 2*3 (3 wiersze i 2 kolumny).
Inicjalizacja tablicy 2D
Możemy zainicjować podczas deklaracji na następujący sposób:
Zauważ, że w 2 i 4 nie wspominaliśmy o 1St indeks. Kompilator C automatycznie oblicza liczbę wierszy na podstawie liczby elementów. Ale 2Nd Należy określić indeks dolny. Po inicjalizacji są nieprawidłowe:
1 2 3 4 5 6 7 8 9 10 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 | //Przykład 1.C #włączać #definicja wiersza 3 #definicja col 2 int main () int I, J; int a [wiersz] [col] = 1,2, 3,4, 5,6 ; printf („W mądre elementy tablicy A są: \ n”); dla (i = 0; i printf („Row %d:”, i); dla (j = 0; j printf („ %d”, a [i] [j]); printf („\ n”); printf ("\ n \ ncolumn mądre elementy tablicy a są: \ n"); dla (i = 0; i printf („kolumna %d:”, i); dla (j = 0; j printf („ %d”, a [j] [i]); printf („\ n”); powrót 0; |
W przykładzie1.c, zadeklarowaliśmy zestaw liczb całkowitych o rozmiarze 3*2 i zainicjowaliśmy. Aby uzyskać dostęp do elementów tablicy, używamy dwóch do pętli.
Aby uzyskać dostęp do wiersza, zewnętrzna pętla dotyczy wierszy, a wewnętrzna pętla jest przeznaczona do kolumn.
Aby uzyskać dostęp do kolumn, zewnętrzna pętla dotyczy kolumn, a wewnętrzna pętla dotyczy wierszy.
Zauważ, że kiedy deklarujemy tablicę 2D, używamy [2] [3], co oznacza 2 wiersze i 3 kolumny. Indeksowanie tablicy rozpoczyna się od 0. Aby uzyskać dostęp do 2Nd Rząd i 3r & D Kolumna, musimy użyć notacji A [1] [2].
Mapowanie pamięci tablicy 2D
Logiczny widok tablicy A [3] [2] może być następujące:
Pamięć komputera to sekwencja 1D bajtów. W języku C, sklep z tablicą 2D w pamięci w Zamówienie szeregu. Niektóre inne języki programowania (e.G., Fortran), przechowuje KOLUMNE MAJOR ZAMÓWIENIE w pamięci.
Wskaźnik arytmetyki tablicy 2D
Aby zrozumieć arytmetykę wskaźnika tablicy 2D, najpierw spójrz na tablicę 1D.
Rozważ tablicę 1D:
W 1d tablic, A jest stała, a jego wartością jest adres 0th Lokalizacja tablicy a [5]. Wartość A+1 to adres 1St Lokalizacja tablicy a [5]. A+i jest adresem Ith Lokalizacja tablicy.
Jeśli zwiększymy A o 1 jest zwiększany o rozmiar typu danych.
a [1] jest równa *(A+1)
a [2] jest równa *(A+2)
a [i] jest równa *(A+i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Przykład2.C #włączać #definicja wiersza 3 #definicja 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)); powrót 0; |
W przykładzie2.C, adres pamięci wyświetla się po heksadecimal. Różnica między A i A+1 wynosi 4, czyli wielkość liczby całkowitej w bajtach.
Teraz rozważ tablicę 2D:
B jest wskaźnikiem typu: int [] [4] Lub int (*) [4]
int [] [4] to rząd 4 liczb całkowitych. Jeśli zwiększamy B o 1, jest on zwiększany o rozmiar wiersza.
B jest adresem 0th wiersz.
B+1 jest adresem 1St wiersz.
B+i jest adresem Ith wiersz.
Rozmiar rzędu to: (Liczba kolumny * sizeof (typ danych)) bajty
Rozmiar rzędu tablicy całkowitej B [3] [4] to: 4 * sizeof (int) = 4 * 4 = 16 bajtów
Rząd tablicy 2D może być postrzegany jako tablica 1D. B jest adresem 0th wiersz. Tak więc otrzymujemy następujące
Adres B [i] [J]: B + sizeof (typ danych) * (liczba kolumny * i + j)
Rozważ tablicę 2D: int b [3] [4]
Adres b [2] [1] jest : B + sizeof (int) * (4 * 2 + 1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // Przykład3.C #włączać #definicja wiersza 3 #definicja kol. 4 int main () int I, J; int b [wiersz] [col] = 10,20,30,40, 50,60,70,80, 90,100,110,120 ; printf („sizeof (int): %ld \ n”, sizeof (int)); printf („Rozmiar wiersza: %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) ); powrót 0; |
W przykładzie3.c, widzieliśmy, że rozmiar rzędu wynosi 16 w notacji dziesiętnej. Różnica między B+1 i B wynosi 10 w heksadecimal. 10 po sześciokadcice jest równoważne 16 w dziesięciu.
Wniosek
W tym artykule dowiedzieliśmy się o
Teraz możemy bez wątpienia użyć tablicy 2D w naszym programie C,
Bibliografia
Uznanie za niektóre pomysły w tej pracy zostały zainspirowane kursem, wskazówkami i tablicami 2D, przez Palash Dey Department of Computer Science & Engg. Indian Institute of Technology Kharagpur