logo

Rodyklė į masyvą | Masyvo rodyklė

Būtina sąlyga: Rodyklės Įvadas

Apsvarstykite šią programą:



C






#include> int> main()> {> >int> arr[5] = { 1, 2, 3, 4, 5 };> >int> *ptr = arr;> >printf>(>'%p '>, ptr);> >return> 0;> }>



>

>

Aukščiau pateiktoje programoje turime žymeklį ptr tai rodo 0thmasyvo elementas. Taip pat galime paskelbti žymeklį, kuris gali nurodyti visą masyvą, o ne tik vieną masyvo elementą. Ši rodyklė naudinga kalbant apie daugiamačius masyvus.

Sintaksė:

data_type  (* var_name ) [size_of_array];>

Čia:

    data_type yra duomenų tipas, kurį turi masyvas. var_name yra žymeklio kintamojo pavadinimas. masyvo_ dydis yra masyvo, į kurį nukreips žymeklis, dydis.

Pavyzdys

int (*ptr)[10];>

čia ptr yra rodyklė, galinti nurodyti 10 sveikųjų skaičių masyvą. Kadangi apatiniai indeksai turi aukštesnę pirmenybę nei netiesioginiai, skliausteliuose būtina įterpti indirect operatorių ir rodyklės pavadinimą. Čia ptr tipas yra „žymiklis į 10 sveikųjų skaičių masyvą“.

Pastaba: žymeklis, rodantis į 0thmasyvo elementas ir rodyklė, nukreipianti į visą masyvą, yra visiškai skirtingi. Tai rodo ši programa:

C




// C program to understand difference between> // pointer to an integer and pointer to an> // array of integers.> #include> int> main()> {> >// Pointer to an integer> >int> *p;> > >// Pointer to an array of 5 integers> >int> (*ptr)[5];> >int> arr[5];> > >// Points to 0th element of the arr.> >p = arr;> > >// Points to the whole array arr.> >ptr = &arr;> > >printf>(>'p = %p, ptr = %p '>, p, ptr);> > >p++;> >ptr++;> > >printf>(>'p = %p, ptr = %p '>, p, ptr);> > >return> 0;> }>

>

>

Išvestis

p = 0x7fff6463e890, ptr = 0x7fff6463e890 p = 0x7fff6463e894, ptr = 0x7fff6463e8a4>

Čia p yra žymeklis į 0thmasyvo elementas arr , kol ptr yra rodyklė, nukreipianti į visą masyvą arr .

  • Bazinis tipas p yra int, o pagrindinis tipas ptr yra „5 sveikųjų skaičių masyvas“.
  • Žinome, kad rodyklės aritmetika atliekama atsižvelgiant į bazinį dydį, todėl jei rašome ptr++, tada rodyklė ptr bus perkeltas į priekį 20 baitų.

Toliau pateiktame paveikslėlyje parodyta rodyklė p ir ptr. Tamsesnė rodyklė žymi žymeklį į masyvą.

Atšaukę nuorodą į rodyklės išraišką, gauname reikšmę, kurią nurodo ta rodyklės išraiška. Žymeklis į masyvą nurodo masyvą, todėl panaikinus nuorodą į jį, turėtume gauti masyvą, o masyvo pavadinimas žymi bazinį adresą. Taigi kiekvieną kartą, kai žymeklis į masyvą atšaukiamas, gauname bazinį masyvo, į kurį jis nurodo, adresą.

C




// C program to illustrate sizes of> // pointer of array> #include> int> main()> {> >int> arr[] = { 3, 5, 6, 7, 9 };> >int> *p = arr;> >int> (*ptr)[5] = &arr;> > >printf>(>'p = %p, ptr = %p '>, p, ptr);> >printf>(>'*p = %d, *ptr = %p '>, *p, *ptr);> > >printf>(>'sizeof(p) = %lu, sizeof(*p) = %lu '>,> >sizeof>(p),>sizeof>(*p));> >printf>(>'sizeof(ptr) = %lu, sizeof(*ptr) = %lu '>,> >sizeof>(ptr),>sizeof>(*ptr));> >return> 0;> }>

>

>

Išvestis

p = 0x7fff55adbff0, ptr = 0x7fff55adbff0 *p = 3, *ptr = 0x7fff55adbff0 sizeof(p) = 8, sizeof(*p) = 4 sizeof(ptr) = 8, sizeof(*ptr) = 20>

Rodyklė į daugiamačius masyvus

1. Rodyklės ir dvimačiai masyvai

Dviejų dimensijų masyve kiekvieną elementą galime pasiekti naudodami du apatinius indeksus, kur pirmasis indeksas reiškia eilutės numerį, o antrasis indeksas - stulpelio numerį. 2-D masyvo elementus taip pat galima pasiekti naudojant žymeklio žymėjimą. Tarkime, arr yra 2-D masyvas, galime pasiekti bet kurį elementą arr[i][j] masyvo naudojant rodyklės išraišką **(*(arr + i) + j) . Dabar pamatysime, kaip galima gauti šią išraišką.
Paimkime dvimatį masyvą arr[3][4] :

int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };>

Kadangi kompiuterio atmintis yra sutvarkyta tiesiškai, 2-D masyvo įrašyti eilutėse ir stulpeliuose neįmanoma. Eilučių ir stulpelių samprata yra tik teorinė, iš tikrųjų 2-D masyvas saugomas eilučių pagrindine tvarka, ty eilutės dedamos viena šalia kitos. Toliau pateiktame paveikslėlyje parodyta, kaip aukščiau pateiktas 2-D masyvas bus saugomas atmintyje.

Kiekviena eilutė gali būti laikoma 1-D matrica, todėl dvimatis masyvas gali būti laikomas vienmačių masyvų rinkiniu, kuris dedamas vienas po kito. Kitaip tariant, galime sakyti, kad 2-D matmenų matricos, kurios dedamos viena po kitos. Taigi čia arr yra 3 elementų masyvas, kur kiekvienas elementas yra 1-D 4 sveikųjų skaičių masyvas.
Žinome, kad masyvo pavadinimas yra pastovi rodyklė, rodanti į 0th1-D masyvas ir jame yra 5000 adresas. Nuo arr yra „žymiklis į 4 sveikųjų skaičių masyvą“, pagal rodyklės aritmetiką išraiška arr + 1 žymės adresą 5016, o išraiška arr + 2 – adresą 5032.
Taigi galime pasakyti arr nurodo į 0th1-D masyvas, arr + 1 nurodo į 1Šv1-D masyvas ir arr + 2 nurodo į 2nd1-D masyvas.

Apskritai galime rašyti:

 arr + i Points to ith element of arr ->Nurodo į i-ąjį 1-D masyvą>>> 
  • Kadangi arr + i nurodo į ithelementas arr , panaikinus nuorodą jis gaus ithelementas arr kuris, žinoma, yra 1-D masyvas. Taigi išraiška *(arr + i) suteikia mums bazinį i adresąth1-D masyvas.
  • Mes žinome, rodyklės išraiška *(arr + i) yra lygiavertis indekso išraiškai arr[i] . Taigi *(arr + i) kuri yra tokia pati kaip arr[i] suteikia mums bazinį i adresąth1-D masyvas.
  • Norėdami pasiekti atskirą mūsų 2-D masyvo elementą, turėtume turėti prieigą prie bet kurio jthi elementasth1-D masyvas.
  • Nuo bazinio tipo *(arr + i) yra tarpt ir jame yra 0 adresasthi elementasth1-D masyvas, mes galime gauti tolesnių elementų adresus ith1-D masyvas, pridedant sveikųjų skaičių vertes *(arr + i) .
  • Pavyzdžiui *(arr + i) + 1 atstovaus 1 adresuiŠv1 elementasŠvi elementasth1-D masyvas ir *(arr+i)+2 atstovaus 2 adresuindi elementasth1-D masyvas.
  • Panašiai *(arr + i) + j reikš j adresąthi elementasth1-D masyvas. Atsižvelgdami į šią išraišką, galime gauti jthi elementasth1-D masyvas.

Rodyklės ir trijų dimensijų masyvai

Taigi rodyklės išraiška *(*(*(arr + i ) + j ) + k) atitinka apatinio indekso išraišką arr[i][j][k].
Žinome, kad išraiška *(arr + i) yra lygiavertė arr[i], o išraiška *(*(arr + i) + j) yra lygiavertė arr[i][j]. Taigi galime pasakyti, kad arr[i] reiškia bazinį i adresąth2-D masyvas ir arr[i][j] reiškia j bazinį adresąth1-D masyvas.

Pavyzdys

styginių statytojas

Toliau pateiktame pavyzdyje parodyta programa, skirta spausdinti 3D masyvo elementus naudojant rodykles.

C




// C program to print the elements of 3-D> // array using pointer notation> #include> int> main()> {> >int> arr[2][3][2] = {> >{> >{5, 10},> >{6, 11},> >{7, 12},> >},> >{> >{20, 30},> >{21, 31},> >{22, 32},> >}> >};> >int> i, j, k;> >for> (i = 0; i <2; i++)> >{> >for> (j = 0; j <3; j++)> >{> >for> (k = 0; k <2; k++)> >printf>(>'%d '>, *(*(*(arr + i) + j) +k));> >printf>(>' '>);> >}> >}> >return> 0;> }>

>

>

Išvestis

5 10 6 11 7 12 20 30 21 31 22 32>

Toliau pateiktame paveikslėlyje parodyta, kaip pirmiau pateiktoje programoje naudojamas 3-D masyvas yra saugomas atmintyje.

Rodyklės prenumerata į masyvą

Tarkime arr yra 2-D masyvas su 3 eilutėmis ir 4 stulpeliais ir ptr yra žymeklis į 4 sveikųjų skaičių masyvą ir ptr yra bazinis masyvo adresas arr .

int arr[3][4] = {{10, 11, 12, 13}, {20, 21, 22, 23}, {30, 31, 32, 33}}; int (*ptr)[4]; ptr = arr;>

Nuo ptr yra žymeklis į pirmosios eilutės 2-D masyvą, t. y. 4 sveikųjų skaičių masyvą, ptr + i nurodys į itheilė. Dėl nuorodų panaikinimo ptr + i , gauname i bazinį adresątheilė. Norėdami pasiekti j adresąthi elementastheilutėje galime pridėti j prie rodyklės išraiškos *(ptr + i) . Taigi rodyklės išraiška *(ptr + i) + j nurodo j adresąthi elementastheilutę ir žymeklio išraišką **(*(ptr + i)+j) suteikia j reikšmęthi elementastheilė.
Žinome, kad rodyklės išraiška *(*(ptr + i) + j) yra lygiavertė apatinio indekso išraiškai ptr[i][j]. Taigi, jei turime žymeklio kintamąjį, kuriame yra pagrindinis 2-D masyvo adresas, galime pasiekti masyvo elementus dvigubai užsiprenumeravę tą žymeklio kintamąjį.

Pavyzdys

C




// C program to print elements of a 2-D array> // by scripting a pointer to an array> #include> int> main()> {> >int> arr[3][4] = {> >{10, 11, 12, 13},> >{20, 21, 22, 23},> >{30, 31, 32, 33}> >};> >int> (*ptr)[4];> >ptr = arr;> >printf>(>'%p %p %p '>, ptr, ptr + 1, ptr + 2);> >printf>(>'%p %p %p '>, *ptr, *(ptr + 1), *(ptr + 2));> >printf>(>'%d %d %d '>, **ptr, *(*(ptr + 1) + 2), *(*(ptr + 2) + 3));> >printf>(>'%d %d %d '>, ptr[0][0], ptr[1][2], ptr[2][3]);> >return> 0;> }>

>

>

Išvestis

0x7ffc9556b790 0x7ffc9556b7a0 0x7ffc9556b7b0 0x7ffc9556b790 0x7ffc9556b7a0 0x7ffc9556b7b0 10 22 33 10 22 33>