Kazalci in nizi C ++

V tej vadnici bomo s pomočjo primerov spoznali odnos med nizi in kazalci.

V C ++ so kazalci spremenljivke, ki vsebujejo naslove drugih spremenljivk. Kazalec lahko shrani ne samo naslov ene spremenljivke, temveč tudi naslov celic matrike.

Razmislite o tem primeru:

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

Tu je ptr kazalna spremenljivka, medtem ko je arr intmatrika. Koda ptr = arr;shrani naslov prvega elementa polja v spremenljivko ptr.

Upoštevajte, da smo uporabili arrnamesto &arr(0). To je zato, ker sta oba enaka. Torej, spodnja koda je enaka zgornji.

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

Naslovi za preostanek array elementov, ki jo &arr(1), &arr(2), &arr(3), in &arr(4).

Kažite na Vsak element matrike

Recimo, da moramo na isti kazalec ptr pokazati na četrti element polja.

Če ptr kaže tukaj na prvi element v zgornjem primeru, ptr + 3bo kazal na četrti element. Na primer

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

Podobno lahko do elementov dostopamo z enim kazalcem. Na primer

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

Recimo, če smo inicializiran ptr = &arr(2);nato

 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);
Delo kazalcev C ++ z nizi

Opomba: Naslov med ptr in ptr + 1 se razlikuje za 4 bajte. To je zato, ker je ptr kazalec na intpodatke. In velikost int je 4 bajta v 64-bitnem operacijskem sistemu.

Podobno, če kazalec ptr kaže na charpodatke tipa, potem je naslov med ptr in ptr + 1 1 bajt. To je zato, ker je velikost znaka 1 bajt.

Primer 1: Kazalci in nizi C ++

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

Izhod

 Prikaz naslova z uporabo nizov: & arr (0) = 0x61fef0 & arr (1) = 0x61fef4 & arr (2) = 0x61fef8 Prikaz naslova s ​​kazalci: ptr + 0 = 0x61fef0 ptr + 1 = 0x61fef4 ptr + 2 = 0x61fef8

V zgornjem programu smo najprej preprosto natisnili naslove elementov matrike, ne da bi uporabili kazalno spremenljivko ptr.

Nato smo s kazalcem ptr usmerili na naslov a (0), ptr + 1na naslov a (1) itd.

V večini kontekstov imena matrik upadajo do kazalcev. Z enostavnimi besedami se imena nizov pretvorijo v kazalce. To je razlog, zakaj lahko s kazalci dostopamo do elementov nizov.

Vendar se moramo zavedati, da kazalci in nizi niso enaki.

Obstaja nekaj primerov, ko imena nizov ne upadajo v kazalce. Če želite izvedeti več, obiščite: Kdaj ime polja ne propade v kazalec?

Primer 2: Ime polja, uporabljeno kot kazalec

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

Izhod

 Vnesite 5 številk: 2,5 3,5 4,5 5 2 Prikaz podatkov: 2,5 3,5 4,5 5 2

Tukaj,

  1. Oznako kazalca smo najprej uporabili za shranjevanje številk, ki jih je uporabnik vnesel v polje matrike.

     cin>> *(arr + i) ;

    Ta koda je enakovredna spodnji kodi:

     cin>> arr(i);

    Upoštevajte, da nismo razglasili ločene spremenljivke kazalca, temveč za zapis kazalca uporabljamo ime polja arr.

    Kot že vemo, ime polja arr kaže na prvi element polja. Torej, lahko mislimo, da arr deluje kot kazalec.

  2. Podobno smo nato uporabili forzanko za prikaz vrednosti arr z uporabo kazalnega zapisa.

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

    Ta koda je enakovredna

     cout << arr(i) << endl ;

Zanimive Članki...