C ++ kursorid ja massiivid

Selles õpetuses õpime näidete abil massiivide ja osutite vahelist suhet.

C ++ keeles on osutid muutujad, mis hoiavad teiste muutujate aadresse. Kursor saab salvestada mitte ainult ühe muutuja aadressi, vaid ka massiivi lahtrite aadressi.

Vaatleme seda näidet:

 int *ptr; int arr(5); // store the address of the first // element of arr in ptr ptr = arr;

Siin on ptr osuti muutuja, arr aga intmassiiv. Kood ptr = arr;salvestab muutuja ptr massiivi esimese elemendi aadressi.

Pange tähele, et oleme arrselle asemel kasutanud &arr(0). Seda seetõttu, et mõlemad on ühesugused. Niisiis, allpool olev kood on sama mis ülaltoodud kood.

 int *ptr; int arr(5); ptr = &arr(0);

Aadressid ülejäänud massiivi elemendid on antud &arr(1), &arr(2), &arr(3), ja &arr(4).

Osutage igale massiivi elemendile

Oletame, et peame osutama massiivi neljandale elemendile, kasutades sama osuti ptr.

Siin, kui ptr osutab ülaltoodud näite esimesele elemendile, siis ptr + 3osutab ka neljandale elemendile. Näiteks,

 int *ptr; int arr(5); ptr = arr; ptr + 1 is equivalent to &arr(1); ptr + 2 is equivalent to &arr(2); ptr + 3 is equivalent to &arr(3); ptr + 4 is equivalent to &arr(4);

Samamoodi saame elementidele juurde pääseda ühe osuti abil. Näiteks,

 // use dereference operator *ptr == arr(0); *(ptr + 1) is equivalent to arr(1); *(ptr + 2) is equivalent to arr(2); *(ptr + 3) is equivalent to arr(3); *(ptr + 4) is equivalent to arr(4);

Oletame, et kui oleme ptr = &arr(2);siis initsialiseerinud

 ptr - 2 is equivalent to &arr(0); ptr - 1 is equivalent to &arr(1); ptr + 1 is equivalent to &arr(3); ptr + 2 is equivalent to &arr(4);
Massiividega C ++ osutite töötamine

Märkus . Aadress ptr ja ptr + 1 vahel erineb 4 baiti. Selle põhjuseks on asjaolu, et ptr on intandmete osuti . Ja int-i suurus on 4-baiti 64-bitises operatsioonisüsteemis.

Samamoodi, kui osuti ptr osutab charandmetüübile, on ptr ja ptr + 1 vaheline aadress 1 baiti. Sellepärast, et tähemärgi suurus on 1 bait.

Näide 1: C ++ osutid ja massiivid

 // C++ Program to display address of each element of an array #include using namespace std; int main() ( float arr(3); // declare pointer variable float *ptr; cout << "Displaying address using arrays: " << endl; // use for loop to print addresses of all array elements for (int i = 0; i < 3; ++i) ( cout << "&arr(" << i << ") = " << &arr(i) << endl; ) // ptr = &arr(0) ptr = arr; cout<<"Displaying address using pointers: "<< endl; // use for loop to print addresses of all array elements // using pointer notation for (int i = 0; i < 3; ++i) ( cout << "ptr + " << i << " = "<< ptr + i << endl; ) return 0; )

Väljund

 Aadressi kuvamine massiivide abil: & arr (0) = 0x61fef0 & arr (1) = 0x61fef4 & arr (2) = 0x61fef8 Aadressi kuvamine osutitega: ptr + 0 = 0x61fef0 ptr + 1 = 0x61fef4 ptr + 2 = 0x61fef8

Ülaltoodud programmis printisime kõigepealt lihtsalt massiivi elementide aadressid, kasutamata kursori muutujat ptr.

Seejärel kasutasime osutit ptr, et osutada a (0) ptr + 1aadressile, osutada a (1) aadressile jne.

Enamikus kontekstides lagunevad massiivinimed osutiteni. Lihtsate sõnadega teisendatakse massiivi nimed osutiteks. See on põhjus, miks saame massiivide elementidele juurdepääsemiseks kasutada näpunäiteid.

Peaksime siiski meeles pidama, et osutid ja massiivid pole ühesugused.

On üksikuid juhtumeid, kus massiivinimed ei lagune osutitena. Lisateabe saamiseks külastage aadressi: Millal ei lagune massiivi nimi osuti?

Näide 2: Kursorina kasutatakse massiivi nime

 // C++ Program to insert and display data entered by using pointer notation. #include using namespace std; int main() ( float arr(5); // Insert data using pointer notation cout << "Enter 5 numbers: "; for (int i = 0; i > *(arr + i) ; ) // Display data using pointer notation cout << "Displaying data: " << endl; for (int i = 0; i < 5; ++i) ( // display value of arr(i) cout << *(arr + i) << endl ; ) return 0; )

Väljund

 Sisestage 5 numbrit: 2,5 3,5 4,5 5 2 2 Kuvatakse andmed: 2,5 3,5 4,5 5 2

Siin,

  1. Kõigepealt kasutasime osuti tähist, et salvestada kasutaja sisestatud numbrid massiivi massiivi.

     cin>> *(arr + i) ;

    See kood on samaväärne alloleva koodiga:

     cin>> arr(i);

    Pange tähele, et me ei ole eraldi kursori muutujat deklareerinud, vaid pigem kasutame osuti tähistamiseks massiivi nime arr.

    Nagu me juba teame, osutab massiivi nimi arr massiivi esimesele elemendile. Niisiis, võime arr'ist mõelda nagu osuti.

  2. Samamoodi kasutasime seejärel forsilmust arr-i väärtuste kuvamiseks, kasutades kursori tähistust.

     cout << *(arr + i) << endl ;

    See kood on samaväärne koodiga

     cout << arr(i) << endl ;

Huvitavad Artiklid...