C Programmeerimine

2D massiiv

2D massiiv
Kahemõõtmeline (2D) massiiv on ühemõõtmeliste (1D) massiivide massiiv. 1D massiivi suurused on võrdsed. 2D massiivi nimetatakse ka ridade ja veergudega maatriksiks.

Vaatame järgmist näidet:

Neid 3 1D massiivi saab kujutada 2D massiivina järgmiselt:

Vaatame veel ühte näidet:

Need 3 1D massiivi ei saa kujutada 2D massiivina, kuna massiivide suurused on erinevad.

2D massiivi deklaratsioon

andmetüüp massiivi nimi[RIDA] [COL]

int a [2] [3];

Kasutades ülaltoodud C-koodi, võime deklareerida täisarv massiiv, a suurusest 2 * 3 (2 rida ja 3 veergu).

char b [3] [2];

Kasutades ülaltoodud C-koodi, võime deklareerida a iseloomu massiiv, b suurusest 2 * 3 (3 rida ja 2 veergu).

2D massiivi initsialiseerimine

Deklaratsiooni vormistamise ajal saame lähtestada järgmistel viisidel:

  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;

Pange tähele, et punktides 2 ja 4 ei ole me ühte maininudst alaindeks. C kompilaator arvutab elementide arvust automaatselt ridade arvu. Kuid 2nd alapunkt tuleb täpsustada. Järgmised lähtestamised on valed:

  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
// Näide1.c
# kaasata
#define 3. RIDA
#define COL 2
int main ()

int i, j;
int a [ROW] [COL] =
1,2,
3,4,
5,6
;
printf ("Massiivi a reaelemendid on: \ n");
jaoks (i = 0; i
printf ("Rida% d:", i);
jaoks (j = 0; j
printf ("% d", a [i] [j]);

printf ("\ n");

printf ("\ n \ nMassiivi a veerutark elemendid on: \ n");
jaoks (i = 0; i
printf ("veerg% d:", i);
jaoks (j = 0; j
printf ("% d", a [j] [i]);

printf ("\ n");

tagastama 0;

Näites1.c, oleme deklareerinud täisarvu massiivi suurusega 3 * 2 ja lähtestanud. Massiivielementidele juurde pääsemiseks kasutame loopi jaoks kahte.

Ridade kaupa juurdepääsuks on välimine silmus ridade jaoks ja sisemine silmus veergude jaoks.

Veergude kaupa juurdepääsuks on väline silmus veergude jaoks ja sisemine silmus ridade jaoks.

Pange tähele, et kui deklareerime 2D massiivi, kasutame [2] [3], mis tähendab 2 rida ja 3 veergu. Massiivi indekseerimine algab 0-st. 2nd rida ja 3rd veerus peame kasutama märget a [1] [2].

2D massiivi mälukaardistamine

Massiivi loogiline vaade a [3] [2] võivad olla järgmised:

Arvutimälu on 1D baitide jada. C-keeles 2D massiivi pood mälus rida-suur järjekord. Mõned muud programmeerimiskeeled (nt.g., FORTRAN), see salvestub veerg-suurem järjekord mällu.

2D massiivi osuti aritmeetika

2D massiivi kursori aritmeetika mõistmiseks vaadake kõigepealt 1D massiivi.

Mõelge 1D massiivile:

1D massiivis, a on konstant ja selle väärtus on 0 aadressth massiivi asukoht a [5]. Väärtus a + 1 on 1 aadressi aadressst massiivi asukoht a [5].  a + i on ettevõtte aadress ith massiivi asukoht.

Kui me suurendame a 1 võrra suurendab seda andmetüübi suurus.

a [1] on samaväärne * (a + 1)

a [2] on samaväärne * (a + 2)

a [i] on samaväärne * (a + i)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Näide2.c
# kaasata
#define 3. RIDA
#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));
tagastama 0;

Näites2.c, kuvatakse mäluaadress kuueteistkümnendsüsteemis. Erinevus a ja a + 1 vahel on 4, mis on täisarv baitides.

Nüüd kaaluge 2D massiivi:

b on tüüpi tüüp: int [] [4] või int (*) [4]

int [] [4] on 4 täisarvu rida. Kui suurendame b võrra 1, suurendatakse seda rea ​​suurusega.

b on ettevõtte aadress 0th rida.

b + 1 on ettevõtte aadress 1st rida.

b + i on aadressi aadress ith rida.

Rea suurus on: (Veeru arv * sizeof (andmetüüp)) baiti

Täisarvu massiivi b [3] [4] rea suurus on: 4 * (int) suurus = 4 * 4 = 16 baiti

2D massiivi rida võib vaadelda kui 1D massiivi. b on ettevõtte aadress 0th rida. Nii saame järgmise

B [i] [j] aadress: b + sizeof (andmetüüp) * (veeru arv * i + j)

Mõelge 2D massiivile: int b [3] [4]

B [2] [1] aadress on : b + (int) suurus * (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
Näide3.c
# kaasata
#define 3. RIDA
#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 ("Rea suurus:% 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) );
tagastama 0;

Näites3.c, oleme näinud, et rea suurus on kümnendkohtades 16. B + 1 ja b vahe on kuueteistkümnendsüsteemis 10. 10 kuueteistkümnendsüsteemis on võrdne 16 kümnendkohaga.

Järeldus

Nii et selles artiklis oleme õppinud

  1. 2D massiivi deklaratsioon
  2. 2D massiivi initsialiseerimine
  3. 2D massiivi mälukaardistamine
  4. 2D massiivi osuti aritmeetika

Nüüd saame oma C-programmis kahtlemata kasutada 2D massiivi,

Viited

Selle teose mõnede ideede au on inspireeritud kursusest "Näpunäited ja 2-D massiivid", mille autor on Palash Dey arvutiteaduse ja Enggi osakond. India tehnoloogiainstituut Kharagpur

Installige uusim OpenRA strateegiamäng Ubuntu Linuxi
OpenRA on tasuta / tasuta reaalajas strateegiamängumootor, mis loob uuesti Westwoodi varased mängud nagu klassikaline Command & Conquer: Red Alert. Ja...
Installige Linuxile uusim Dolphin Emulator for Gamecube & Wii
Dolphini emulaator võimaldab teil mängida valitud Gamecube & Wii mänge Linuxi personaalarvutites (PC). Vabalt saadaval oleva ja avatud lähtekoodiga m...
Kuidas kasutada GameConquerori petumootorit Linuxis
Artikkel sisaldab juhendit GameConquerori petumootori kasutamise kohta Linuxis. Paljud kasutajad, kes mängivad Windowsis mänge, kasutavad rakendust „C...