Pozrime sa na nasledujúci príklad:
Tieto 3 1D polia môžu byť reprezentované ako 2D pole nasledovne:
Pozrime sa na ďalší príklad:
Tieto 3 1D polia nemôžu predstavovať ako 2D pole, pretože veľkosti polí sú odlišné.
Deklarácia 2D poľa
Dátový typ pole-nazov[RIADOK] [COL]
- Dátový typ je dátový typ prvkov poľa.
- Array-name je názov poľa.
- Dva dolné indexy predstavujú počet riadkov a stĺpcov poľa. Celkový počet prvkov poľa bude ROW * COL.
v [2] [3];
Pomocou vyššie uvedeného C kódu môžeme deklarovať celé číslo pole, a veľkosti 2 * 3 (2 riadky a 3 stĺpce).
char b [3] [2];
Pomocou vyššie uvedeného C kódu môžeme deklarovať a znak pole, b veľkosti 2 * 3 (3 riadky a 2 stĺpce).
Inicializácia 2D poľa
Počas deklarácie môžeme inicializovať nasledujúcimi spôsobmi:
- 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;
Všimnite si, že v 2 a 4 sme nespomenuli 1sv dolný index. Kompilátor C automaticky počíta počet riadkov z počtu prvkov. Ale 2nd musí byť uvedený dolný index. Nasledujúce inicializácie sú neplatné:
- 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 | // Príklad1.c #include #define RIADOK 3 # definovať COL 2 int main () int i, j; int a [ROW] [COL] = 1,2, 3,4, 5,6 ; printf ("Po riadkoch Prvky poľa a sú: \ n"); pre (i = 0; i printf ("Riadok% d:", i); pre (j = 0; j printf ("% d", a [i] [j]); printf ("\ n"); printf ("\ n \ nSloupec Elementy poľa a sú: \ n"); pre (i = 0; i printf ("Stĺpec% d:", i); pre (j = 0; j printf ("% d", a [j] [i]); printf ("\ n"); návrat 0; |
V príklade 1.c, deklarovali sme celočíselné pole o veľkosti 3 * 2 a inicializovali sme. Na prístup k prvkom poľa používame dva cykly for.
Vonkajšia slučka je pre riadky a vnútorná pre stĺpy, aby ste získali prístup k riadkom.
Pre prístup po stĺpcoch je vonkajšia slučka pre stĺpce a vnútorná slučka pre riadky.
Upozorňujeme, že keď deklarujeme 2D pole, použijeme [2] [3], čo znamená 2 riadky a 3 stĺpce. Indexovanie poľa začína od 0. Prístup do 2nd riadok a 3rd stĺpec, musíme použiť zápis a [1] [2].
Pamäťové mapovanie 2D poľa
Logický pohľad na pole a [3] [2] môže byť nasledovné:
Pamäť počítača je 1D sekvencia bajtov. V jazyku C je 2D pole uložené v pamäti v radová hlavná objednávka. Niektoré ďalšie programovacie jazyky (napr.g., FORTRAN), ukladá v stĺpová hlavná objednávka v pamäti.
Aritmetika ukazovateľa 2D poľa
Aby ste pochopili aritmetiku ukazovateľa 2D poľa, najskôr sa pozrite na 1D pole.
Zvážte 1D pole:
V 1D poli, a je konštanta a jej hodnota je adresa 0th umiestnenie poľa a [5]. Hodnota a + 1 je adresa 1sv umiestnenie poľa a [5]. a + i je adresa ith umiestnenie poľa.
Ak budeme zvyšovať a o 1, zvyšuje sa o veľkosť dátového typu.
a [1] je ekvivalentné k * (a + 1)
a [2] je ekvivalentné k * (a + 2)
a [i] je ekvivalentné k * (a + i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Príklad2.c #include #define RIADOK 3 # definovať 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)); návrat 0; |
V príklade 2.c, adresa pamäte sa zobrazuje v šestnástkovej sústave. Rozdiel medzi a a + 1 je 4, čo je veľkosť celého čísla v bajtoch.
Teraz zvážte 2D pole:
b je ukazovateľ typu: int [] [4] alebo int (*) [4]
int [] [4] je riadok so 4 celými číslami. Ak zvýšime b o 1, zvýši sa to o veľkosť riadku.
b je adresa 0th riadok.
b + 1 je adresa 1sv riadok.
b + i je adresa ith riadok.
Veľkosť riadku je: (Počet stĺpcov * sizeof (dátový typ)) bajtov
Veľkosť riadku celočíselného poľa b [3] [4] je: 4 * sizeof (int) = 4 * 4 = 16 bajtov
Riadok 2D poľa sa môže považovať za 1D pole. b je adresa 0th riadok. Takže máme nasledujúce
- * b + 1 je adresa 1sv prvok 0th
- * b + j je adresa jth prvok 0th
- * (b + i) je adresa 0th prvok ith
- * (b + i) + j je adresa jth prvok ith
- b [0] [0] je ekvivalentné s ** b
- b [0] [1] sa rovná * (* b + 1)
- b [1] [0] sa rovná * (* (b + 1))
- b [1] [1] sa rovná * (* (b + 1) +1)
- b [i] [j] je ekvivalentné s * (* (b + i) + j)
Adresa b [i] [j]: b + sizeof (údajový typ) * (počet stĺpcov * i + j)
Zvážte 2D pole: int b [3] [4]
Adresa b [2] [1] je : 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 | // Príklad3.c #include #define RIADOK 3 # definovať COL 4 int main () int i, j; int b [ROW] [COL] = 10,20,30,40, 50,60,70,80, 90 100 110 110 120 ; printf ("sizeof (int):% ld \ n", sizeof (int)); printf ("Veľkosť riadku:% 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) ); návrat 0; |
V príklade 3.c, videli sme, že veľkosť riadku je 16 v desatinnej notácii. Rozdiel medzi b + 1 a b je 10 v šestnástkovej sústave. 10 v šestnástkovej sústave sa rovná 16 v desiatkovej sústave.
Záver
V tomto článku sme sa teda dozvedeli niečo o
- Deklarácia 2D poľa
- Inicializácia 2D poľa
- Pamäťové mapovanie 2D poľa
- Aritmetika ukazovateľa 2D poľa
Teraz môžeme v našom programe C bezpochyby použiť 2D pole,
Referencie
Kredit za niektoré nápady v tejto práci inšpiroval kurz Pointers and 2-D Arrays od Palash Dey Department of Computer Science & Engg. Indický technologický inštitút Kharagpur