Ukazatele a pole v C ++

V tomto kurzu se pomocí příkladů dozvíme o vztahu mezi poli a ukazateli.

V C ++ jsou ukazatele proměnné, které obsahují adresy jiných proměnných. Ukazatel může nejen ukládat adresu jedné proměnné, ale může také ukládat adresu buněk pole.

Zvažte tento příklad:

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

Zde je ptr ukazatel proměnné, zatímco arr je intpole. Kód ptr = arr;ukládá adresu prvního prvku pole do proměnné ptr.

Všimněte si, že jsme použili arrmísto &arr(0). Je to proto, že oba jsou stejné. Níže uvedený kód je tedy stejný jako výše uvedený kód.

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

Adresy pro zbytek prvky pole jsou dány &arr(1), &arr(2), &arr(3), a &arr(4).

Ukažte na všechny prvky pole

Předpokládejme, že musíme ukazovat na čtvrtý prvek pole pomocí stejného ukazatele ptr.

Zde, pokud ptr ukazuje na první prvek ve výše uvedeném příkladu, ptr + 3bude ukazovat na čtvrtý prvek. Například,

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

Podobně můžeme přistupovat k prvkům pomocí jediného ukazatele. Například,

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

Předpokládejme, že pokud jsme ptr = &arr(2);pak inicializovali

 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);
Práce s ukazateli C ++ s poli

Poznámka: Adresa mezi ptr a ptr + 1 se liší o 4 bajty. Je to proto, že ptr je ukazatel na intdata. A velikost int je 4 bajty v 64bitovém operačním systému.

Podobně, pokud ukazatel ptr ukazuje na chartypová data, pak je adresa mezi ptr a ptr + 1 1 bajt. Je to proto, že velikost znaku je 1 bajt.

Příklad 1: C ++ ukazatele a pole

 // 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ýstup

 Zobrazení adresy pomocí polí: & arr (0) = 0x61fef0 & arr (1) = 0x61fef4 & arr (2) = 0x61fef8 Zobrazení adresy pomocí ukazatelů: ptr + 0 = 0x61fef0 ptr + 1 = 0x61fef4 ptr + 2 = 0x61fef8

Ve výše uvedeném programu jsme nejprve jednoduše vytiskli adresy prvků pole bez použití proměnné ukazatele ptr.

Potom jsme použili ukazatel ptr k nasměrování na adresu a (0), ptr + 1k nasměrování na adresu a (1) atd.

Ve většině kontextů se názvy polí rozpadají na ukazatele. Jednoduše řečeno, názvy polí jsou převedeny na ukazatele. To je důvod, proč můžeme použít ukazatele pro přístup k prvkům polí.

Měli bychom si však pamatovat, že ukazatele a pole nejsou stejné.

Existuje několik případů, kdy se názvy polí nerozkládají na ukazatele. Další informace najdete na stránce: Kdy se název pole nerozpadá na ukazatel?

Příklad 2: Název pole použitý jako ukazatel

 // 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ýstup

 Zadejte 5 čísel: 2,5 3,5 4,5 5 2 Zobrazení dat: 2,5 3,5 4,5 5 2

Tady,

  1. Nejprve jsme použili ukazatelovou notaci k uložení čísel zadaných uživatelem do pole pole.

     cin>> *(arr + i) ;

    Tento kód je ekvivalentní níže uvedenému kódu:

     cin>> arr(i);

    Všimněte si, že jsme nedeklarovali samostatnou proměnnou ukazatele, ale spíše používáme název pole arr pro notaci ukazatele.

    Jak již víme, název pole arr ukazuje na první prvek pole. Můžeme si tedy představit, že arr funguje jako ukazatel.

  2. Podobně jsme pak použili forsmyčku k zobrazení hodnot arr pomocí notace ukazatele.

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

    Tento kód je ekvivalentní s

     cout << arr(i) << endl ;

Zajímavé články...