2D -matrise

2D -matrise
En todimensjonal (2D) matrise er en rekke en dimensjonal (1D) matriser. 1D -arraystørrelsene er like. 2D -matrisen kalles også en matrise med rader og kolonner.

La oss se følgende eksempel:

Disse 3 1D -matriser kan representeres som en 2D -matrise som følger:

La oss se et annet eksempel:

Disse 3 1D -matriser kan ikke representere som en 2D -matrise fordi størrelsene på matriser er forskjellige.

Erklæring om 2D -matrise

data-type Array-Name[RAD] [Col]

  • Data-type er datatypen til matriseelementene.
  • Array-Name er navnet på matrisen.
  • To abonnement representerer antall rader og kolonner i matrisen. Det totale antall elementer i matrisen vil være rad*col.

int a [2] [3];

Ved å bruke ovennevnte C -kode kan vi erklære en heltall Array, en av størrelse 2*3 (2 rader og 3 kolonner).

Char B [3] [2];

Ved å bruke ovennevnte C -kode kan vi erklære en karakter Array, b av størrelse 2*3 (3 rader og 2 kolonner).

Initialisering av 2D -matrise

Vi kan initialisere under erklæring på følgende måter:

  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;

Merk at i 2 og 4 har vi ikke nevnt 1st abonnement. C -kompilatoren beregner automatisk antall rader fra antall elementer. Men de 2nd abonnement må spesifiseres. Følgende initialiseringer er ugyldige:

  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
1. 3
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
// Eksempel1.c
#inkludere
#Define rad 3
#Define Col 2
int main ()

int i, j;
int a [rad] [col] =
1,2,
3,4,
5,6
;
printf ("Row Wise Elements of the Array A er: \ n");
for (i = 0; i
printf ("rad %d:", i);
for (j = 0; j
printf (" %d", a [i] [j]);

printf ("\ n");

printf ("\ n \ ncolumn wise elementer i matrisen a er: \ n");
for (i = 0; i
printf ("kolonne %d:", i);
for (j = 0; j
printf (" %d", a [j] [i]);

printf ("\ n");

retur 0;

I eksempel1.C, vi har erklært et heltall med størrelse 3*2 og initialisert. For å få tilgang til arrayelementer, bruker vi to for loop.

For å få tilgang til radmessig er den ytre sløyfen for rader, og den indre sløyfen er for søyler.

For å få tilgang til kolonnemessig er den ytre sløyfen for søyler, og den indre sløyfen er for rader.

Merk at når vi erklærer en 2D -matrise, bruker vi en [2] [3], som betyr 2 rader og 3 kolonner. Array -indeksering starter fra 0. For å få tilgang til 2nd rad og 3Rd Kolonne, vi må bruke notasjonen A [1] [2].

Minnekartlegging av en 2D -matrise

Den logiske visningen av en matrise A [3] [2] Kan være som følger:

Dataminne er en 1D -sekvens av byte. På C -språk, en 2D -matrisebutikk i minnet i ROW-MAJOR BESTILLING. Noen andre programmeringsspråk (e.g., Fortran), det lagrer det i Kolonne-major-bestilling i minnet.

Pointer aritmetikk av en 2D -matrise

For å forstå pekeren aritmetikk for 2D -arrayen, først, ta en titt på 1D -matrisen.

Vurder en 1D -matrise:

I 1D -matrise, en er en konstant, og verdien er adressen til 0th Plassering av matrisen A [5]. Verdien av A+1 er adressen til 1st Plassering av matrisen A [5]. a+i er adressen til Jegth Plassering av matrisen.

Hvis vi øker en innen 1 økes det av størrelsen på datatypen.

A [1] tilsvarer *(A+1)

A [2] tilsvarer *(A+2)

a [i] tilsvarer *(a+i)

1
2
3
4
5
6
7
8
9
10
11
12
1. 3
14
15
16
17
18
19
20
21
// Eksempel2.c
#inkludere
#Define rad 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));
retur 0;

I eksempel2.C, hukommelsesadressen vises i heksadesimal. Forskjellen mellom A og A+1 er 4, som er på størrelse med et heltall i byte.

Vurder nå en 2D -matrise:

b er en peker av type: int [] [4] eller int (*) [4]

int [] [4] er en rad på 4 heltall. Hvis vi øker B med 1, økes det med størrelsen på raden.

b er adressen til 0th rad.

B+1 er adressen til 1st rad.

B+i er adressen til Jegth rad.

Størrelsen på en rad er: (Antall kolonne * SizeOf (Data-type)) byte

Størrelse på en rad i et heltallsarray B [3] [4] er: 4 * størrelse av (int) = 4 * 4 = 16 byte

En rad med en 2D -matrise kan sees på som en 1D -matrise. b er adressen til 0th rad. Så vi får følgende

  • *B+1 er adressen til 1st element i 0th
  • *B+J er adressen til jth element i 0th
  • *(B+I) er adressen til 0th element i Jegth
  • *(b+i)+j er adressen til jth element i Jegth
  • B [0] [0] tilsvarer ** B
  • B [0] [1] tilsvarer *( *b+1)
  • B [1] [0] tilsvarer *( *(b+1))
  • B [1] [1] tilsvarer *( *(b+1) +1)
  • b [i] [j] tilsvarer *( *(b+i)+j)

Adresse til b [i] [j]: B + SizeOf (Data-type) * (Antall kolonne * I + J)

Vurder en 2D -matrise: int b [3] [4]

Adresse til B [2] [1] er : b + størrelse av (int) * (4 * 2 + 1)

1
2
3
4
5
6
7
8
9
10
11
12
1. 3
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Eksempel3.c
#inkludere
#Define rad 3
#Define Col 4
int main ()

int i, j;
int b [rad] [col] =
10,20,30,40,
50,60,70,80,
90,100,110,120
;
printf ("sizeof (int): %ld \ n", størrelse av (int));
printf ("størrelse på en rad: %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) );
retur 0;

I eksempel3.C, vi har sett den størrelsen på en rad er 16 i desimalnotasjon. Forskjellen mellom B+1 og B er 10 i heksadesimal. 10 i heksadesimal tilsvarer 16 i desimal.

Konklusjon

Så i denne artikkelen har vi lært om

  1. Erklæring om 2D -matrise
  2. Initialisering av 2D -matrise
  3. Minnekartlegging av 2D -matrise
  4. Pointer aritmetikk av 2D -matrise

Nå kan vi bruke 2D -matrise i vårt C -program uten tvil,

Referanser

Kreditt for noen ideer i dette arbeidet ble inspirert av kurset, pekere og 2-D-matriser, av Palash Dey Department of Computer Science & Engg. Indian Institute of Technology Kharagpur