C Programovanie

2D pole

2D pole
Dvojrozmerné (2D) pole je pole jednorozmerných (1D) polí. Veľkosti 1D poľa sú rovnaké. 2D pole sa tiež nazýva matica s riadkami a stĺpcami.

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]

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:

  1. int a [3] [2] = 1,2,3,4,5,6;
  2. int a [] [2] = 1,2,3,4,5,6;
  3. int a [3] [2] = 1, 2, 3, 4, 5, 6;
  4. 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é:

  1. int a [3] [] = 1,2,3,4,5,6;
  2. 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

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

  1. Deklarácia 2D poľa
  2. Inicializácia 2D poľa
  3. Pamäťové mapovanie 2D poľa
  4. 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

Top 5 ergonomických produktov pre počítačové myši pre Linux
Spôsobuje dlhodobé používanie počítača bolesť zápästia alebo prstov? Trpíte stuhnutými kĺbmi a neustále si musíte podávať ruky? Cítite pálivú bolesť z...
Ako zmeniť nastavenie myši a touchpadu pomocou systému Xinput v systéme Linux
Väčšina distribúcií systému Linux sa štandardne dodáva s knižnicou „libinput“ na spracovanie vstupných udalostí v systéme. Dokáže spracovať vstupné ud...
S ovládaním pomocou myši X-Mouse môžete tlačidlá myši premapovať odlišne pre iný softvér
Možno budete potrebovať nástroj, ktorý by mohol zmeniť ovládanie myši pri každej aplikácii, ktorú používate. Ak je to váš prípad, môžete vyskúšať apli...