C Programiranje

2D matrika

2D matrika
Dvodimenzionalno (2D) polje je polje enodimenzionalnih (1D) nizov. Velikosti 1D matrike so enake. 2D matriko imenujemo tudi matrika z vrsticami in stolpci.

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]

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:

  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;

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:

  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
// 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

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

  1. Izjava o 2D matriki
  2. Inicializacija 2D matrike
  3. Preslikava pomnilnika 2D matrike
  4. 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

Najboljše aplikacije za preslikavo gamepadov za Linux
Če želite igre na Linuxu igrati z igralno ploščico namesto s tipičnim sistemom za vnos tipkovnice in miške, je za vas na voljo nekaj uporabnih aplikac...
Uporabna orodja za igralce Linux
Če radi igrate igre na Linuxu, obstaja verjetnost, da ste za izboljšanje igralne izkušnje uporabljali aplikacije in pripomočke, kot so Wine, Lutris in...
HD Remastered Games za Linux, ki prej še niso izdale Linuxa
Mnogi razvijalci iger in založniki pripravijo HD remaster starih iger, da podaljšajo življenjsko dobo franšize, zato oboževalci zahtevajo združljivost...