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]
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:
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 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
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
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