C ++ osoittimet ja taulukot

Tässä opetusohjelmassa opitaan taulukoiden ja osoittimien välisestä suhteesta esimerkkien avulla.

Kohdassa C ++ osoittimet ovat muuttujia, jotka pitävät muiden muuttujien osoitteita. Osoitin voi tallentaa paitsi yhden muuttujan osoitteen, myös matriisin solujen osoitteen.

Harkitse tätä esimerkkiä:

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

Tässä ptr on osoittimen muuttuja, kun arr on inttaulukko. Koodi ptr = arr;tallentaa taulukon ensimmäisen elementin osoitteen muuttujaan ptr.

Huomaa, että olemme käyttäneet arrsijasta &arr(0). Tämä johtuu siitä, että molemmat ovat samat. Joten alla oleva koodi on sama kuin yllä oleva koodi.

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

Osoitteet loput ryhmän elementit on annettu &arr(1), &arr(2), &arr(3), ja &arr(4).

Osoita jokaista taulukon elementtiä

Oletetaan, että meidän on osoitettava taulukon neljänteen elementtiin samaa osoitinta ptr.

Jos ptr viittaa yllä olevan esimerkin ensimmäiseen elementtiin, ptr + 3se osoittaa sitten neljänteen elementtiin. Esimerkiksi,

 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);

Vastaavasti voimme käyttää elementtejä yhden osoittimen avulla. Esimerkiksi,

 // 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);

Oletetaan, jos olemme alustaneet ptr = &arr(2);sitten

 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);
C ++ -osoittimien käyttö matriisien kanssa

Huomaa: ptr: n ja ptr + 1 : n välinen osoite eroaa 4 tavulla. Se johtuu siitä, että ptr on osoitin inttietoihin. Int-koko on 4 tavua 64-bittisessä käyttöjärjestelmässä.

Vastaavasti, jos osoitin ptr osoittaa chartyypin tietoja, ptr: n ja ptr + 1: n välinen osoite on 1 tavu. Tämä johtuu siitä, että merkin koko on 1 tavu.

Esimerkki 1: C ++ -osoittimet ja taulukot

 // 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; )

Tuotos

 Osoitteen näyttäminen taulukoiden avulla: & arr (0) = 0x61fef0 & arr (1) = 0x61fef4 & arr (2) = 0x61fef8 Osoitteen näyttäminen osoittimilla: ptr + 0 = 0x61fef0 ptr + 1 = 0x61fef4 ptr + 2 = 0x61fef8

Yllä olevassa ohjelmassa tulostimme ensin yksinkertaisesti taulukkoelementtien osoitteet ilman osoittimen muuttujaa ptr.

Sitten käytimme osoitinta ptr osoittamaan osoitteen (0), ptr + 1osoittamaan osoitteen (1) ja niin edelleen.

Useimmissa yhteyksissä taulukon nimet hajoavat osoittimiksi. Yksinkertaisesti sanottuna taulukon nimet muunnetaan osoittimiksi. Siksi voimme käyttää osoittimia päästäksesi matriisien elementteihin.

Meidän tulisi kuitenkin muistaa, että osoittimet ja taulukot eivät ole samat.

On muutamia tapauksia, joissa taulukon nimet eivät hajoa osoittimiin. Lisätietoja on osoitteessa: Milloin matriisin nimi ei hajoa osoittimeksi?

Esimerkki 2: Taulukon nimi, jota käytetään osoittimena

 // 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; )

Tuotos

 Syötä 5 numeroa: 2,5 3,5 4,5 5 2 2 Näytetään tiedot: 2,5 3,5 4,5 5 2

Tässä,

  1. Käytimme ensin osoittimen merkintää tallentaaksemme käyttäjän syöttämät numerot matriisiryhmään.

     cin>> *(arr + i) ;

    Tämä koodi vastaa alla olevaa koodia:

     cin>> arr(i);

    Huomaa, että emme ole ilmoittaneet erillistä osoittimen muuttujaa, vaan käytämme pikemminkin taulukon nimeä arr osoittimen osoittamiseen.

    Kuten jo tiedämme, taulukon nimi arr osoittaa taulukon ensimmäiseen elementtiin. Joten voimme ajatella arr toimivan kuin osoitin.

  2. Vastaavasti käytimme sitten forsilmukkaa arr-arvojen näyttämiseen osoittimen merkinnällä.

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

    Tämä koodi vastaa koodia

     cout << arr(i) << endl ;

Mielenkiintoisia artikkeleita...