Poglejmo naslednji primer:
Te 3D-matrike lahko predstavimo kot 2D-matriko, kot sledi:
Poglejmo še en primer:
Teh 3D-nizov ni mogoče predstaviti kot 2D-polja, ker so velikosti nizov različne.
Izjava o 2D matriki
podatkovni tip ime polja[VRSTICA] [COL]
- Vrsta podatkov je podatkovni tip elementov matrike.
- Array-name je ime matrike.
- Dva indeksa predstavljata število vrstic in stolpcev polja. Skupno število elementov polja bo ROW * COL.
int a [2] [3];
Z uporabo zgornje kode C lahko razglasimo celo število matriko, a velikosti 2 * 3 (2 vrstici in 3 stolpci).
char b [3] [2];
Z uporabo zgornje kode C lahko razglasimo a znak matriko, b velikosti 2 * 3 (3 vrstice in 2 stolpca).
Inicializacija 2D matrike
Med deklaracijo lahko inicializiramo na naslednje načine:
- int a [3] [2] = 1,2,3,4,5,6;
- int a [] [2] = 1,2,3,4,5,6;
- int a [3] [2] = 1, 2, 3, 4, 5, 6;
- int a [] [2] = 1, 2, 3, 4, 5, 6;
Upoštevajte, da v 2 in 4 nismo omenili 1st podpis. Prevajalnik C samodejno izračuna število vrstic iz števila elementov. Toda 2nd podpisan mora biti naveden. Naslednje inicializacije so neveljavne:
- int a [3] [] = 1,2,3,4,5,6;
- int a [] [] = 1,2,3,4,5,6;
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 | // Primer1.c #include #define ROW 3 #define COL 2 int main () int i, j; int a [ROW] [COL] = 1,2, 3,4, 5,6 ; printf ("Vrstni elementi elementa a so: \ n"); za (i = 0; i printf ("Vrstica% d:", i); za (j = 0; j printf ("% d", a [i] [j]); printf ("\ n"); printf ("\ n \ nElementi stolpca a so: \ n"); za (i = 0; i printf ("Stolpec% d:", i); za (j = 0; j printf ("% d", a [j] [i]); printf ("\ n"); vrnitev 0; |
V primeru1.c, razglasili smo celoštevilsko polje velikosti 3 * 2 in inicializirali. Za dostop do elementov matrike uporabimo dva for for.
Za dostop po vrsticah je zunanja zanka namenjena vrsticam, notranja zanka pa stolpcem.
Za dostop po stolpcih je zunanja zanka namenjena stolpcem, notranja zanka pa vrsticam.
Upoštevajte, da ko razglasimo 2D matriko, uporabimo [2] [3], kar pomeni 2 vrstici in 3 stolpci. Indeksiranje matrike se začne od 0. Za dostop do 2nd vrstica in 3rd stolpec, moramo uporabiti zapis a [1] [2].
Preslikava pomnilnika 2D matrike
Logičen pogled na matriko a [3] [2] lahko naslednji:
Računalniški pomnilnik je 1D zaporedje bajtov. V jeziku C 2D matriko shrani v pomnilnik v vrstni-glavni vrstni red. Nekateri drugi programski jeziki (npr.g., FORTRAN), shranjuje v stolpec-glavni vrstni red v spominu.
Aritmetika kazalca 2D matrike
Za razumevanje aritmetike kazalca 2D matrike si najprej oglejte 1D matriko.
Razmislite o 1D matriki:
V 1D matriki, a je konstanta, njegova vrednost pa je naslov 0th lokacija matrike a [5]. Vrednost a + 1 je naslov 1st lokacija polja a [5]. a + i je naslov jazth lokacija polja.
Če povečujemo a za 1 se poveča za velikost podatkovnega tipa.
a [1] je enakovredno * (a + 1)
a [2] je enakovredno * (a + 2)
a [i] je enakovredno * (a + i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Primer2.c #include #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)); vrnitev 0; |
V primeru2.c, naslov pomnilnika je prikazan v šestnajstiški številki. Razlika med a in a + 1 je 4, kar je velikost celotnega števila v bajtih.
Zdaj razmislite o 2D matriki:
b je kazalec tipa: int [] [4] ali int (*) [4]
int [] [4] je vrstica 4 celih števil. Če b povečamo za 1, se poveča za velikost vrstice.
b je naslov 0th vrstici.
b + 1 je naslov 1st vrstici.
b + i je naslov jazth vrstici.
Velikost vrstice je: (Število bajtov * velikost stolpca * velikost (vrsta podatkov))
Velikost vrstice celoštevilskega polja b [3] [4] je: 4 * sizeof (int) = 4 * 4 = 16 bajtov
Vrstico 2D matrike lahko obravnavamo kot 1D matriko. b je naslov 0th vrstici. Tako dobimo naslednje
- * b + 1 je naslov 1st element 0th
- * b + j je naslov jth element 0th
- * (b + i) je naslov 0th element jazth
- * (b + i) + j je naslov jth element jazth
- b [0] [0] je enakovredno ** b
- b [0] [1] je enakovredno * (* b + 1)
- b [1] [0] je enakovredno * (* (b + 1))
- b [1] [1] je enakovredno * (* (b + 1) +1)
- b [i] [j] je enakovredno * (* (b + i) + j)
Naslov b [i] [j]: b + velikost (podatkovni tip) * (Število stolpcev * i + j)
Razmislite o 2D matriki: int b [3] [4]
Naslov b [2] [1] je : b + velikost (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 | // Primer3.c #include #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 ("Velikost vrstice:% 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) ); vrnitev 0; |
V primeru3.c, videli smo, da je velikost vrstice 16 v decimalnem zapisu. Razlika med b + 1 in b je 10 v šestnajstiški. 10 v šestnajstiški vrednosti je enako 16 v decimalni številki.
Zaključek
V tem članku smo torej izvedeli več o tem
- Izjava o 2D matriki
- Inicializacija 2D matrike
- Preslikava pomnilnika 2D matrike
- Aritmetika kazalca 2D matrike
Zdaj lahko v našem programu C brez dvoma uporabimo 2D matriko,
Reference
Zasluge za nekatere ideje v tem delu so navdihnili tečaj, Kazalci in 2-D nizi, Palash Dey, Oddelek za računalništvo in angleščino. Indijski tehnološki inštitut Kharagpur