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 int
pole. Kód ptr = arr;
ukládá adresu prvního prvku pole do proměnné ptr.
Všimněte si, že jsme použili arr
mí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 + 3
bude 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);
![](https://cdn.wiki-base.com/5329031/c_pointers_and_arrays.png.webp)
Poznámka: Adresa mezi ptr a ptr + 1 se liší o 4 bajty. Je to proto, že ptr je ukazatel na int
data. A velikost int je 4 bajty v 64bitovém operačním systému.
Podobně, pokud ukazatel ptr ukazuje na char
typová 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 + 1
k 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,
-
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.
-
Podobně jsme pak použili
for
smyčku k zobrazení hodnot arr pomocí notace ukazatele.cout << *(arr + i) << endl ;
Tento kód je ekvivalentní s
cout << arr(i) << endl ;