Deklarujeme pole ako pointer
Ako definujeme pole ako pointer? Deklarácia je podobná ako napr. pri numerickej premennej. Vytvorme pointer, ktorý bude odkazovať na pole. I keď formulácia „odkazovať na pole“ nie je úplne správna, pretože ukazovateľ neukazuje na nejakú adresu poľa, ale na prvý prvok poľa. Adresa poľa ako taká neexistuje. Pole je zložené z prvkov, pričom každý prvok má svoju adresu v pamätí.
#include <iostream> using namespace std; int main() { int pole[] = {13,17,25,89,33}; int *pointerPole = pole; return 0; }
Super, program nám zbehol bez problémov. Zdá sa, že sme pole ako pointer deklarovali správne. Skúsme pole vypísať. Čo myslíte, že nám program vypíše?
#include <iostream> using namespace std; int main() { int pole[] = {13,17,25,89,33}; int *pointerPole = pole; cout << *pointerPole; return 0; }
Ak ste tipovali správne, že program vypíše len prvý prvok, tak princípu už pomerne dobre chápete. Teraz sa presvedčme, že sme pointeru priradili adresu prvého prvku poľa.
#include <iostream> using namespace std; int main() { int pole[] = {13,17,25,89,33}; int *pointerPole = pole; cout<<"Adresa pointeru: "<< pointerPole; cout<<"\nAdresa povodneho pola: "<<pole; return 0; }
Výsledok programu:
Adresa pointeru: 0x6dfee8 Adresa povodneho pola: 0x6dfee8
Vidíme, že adresa je rovnaká.
Pointerová aritmetika
Keď už pomerne dobré chápeme problematiky adries v spojení s poľami, ukážeme si efektívnu prácu na základe toho, čo sme sa práve dozvedeli. Totiž, ak pole je množina za sebou idúcich buniek pamäte, vieme sa na základe pointerovej aritmetiky rýchlo dostať do ľubovoľného prvku poľa.
Skúsme použiť pointerovú aritmetiku a zároveň vypísať adresy jednorozmerného poľa. Ak by vás zmiatlo pomenovanie „jednorozmerný“, nie je to nič iné než pole, s ktorým sme doteraz pracujeme. Toto pole má jeden rozmer, dĺžku. To len aby sme mali jasno v pojmoch.
#include <iostream> using namespace std; int main() { int pole[] = {13,17,25,89,33}; int *pointerPole = pole; int *pomocnePointerPole = pointerPole; int velkostPola = sizeof(pole) / sizeof(int); cout << "Vypisanie hodnot a adries pola: \n"; while(pointerPole < pomocnePointerPole + velkostPola) { cout << *pointerPole << " a adresa bunky pamate: " << pointerPole << "\n"; pointerPole++; } cout << "\n"; return 0; }
Výsledok programu:
Vypisanie hodnot a adries pola: 13 a adresa bunky pamate: 0x6dfee0 17 a adresa bunky pamate: 0x6dfee4 25 a adresa bunky pamate: 0x6dfee8 89 a adresa bunky pamate: 0x6dfeec 33 a adresa bunky pamate: 0x6dfef0
Všimnite si, že jednotlivé adresy prvkov sú od seba vzdialené 4 bajty, čiže o veľkosť celého čísla. Ak napíšeme pointerPole++;
, dôjde k sčítaniu adresy s jedným celým číslom, presne takto: pointerPole + 1
. Ak napíšeme pointerPole + 2
, tak sa adresa sčíta o dve celé čísla. Vyskúšajme si ako to funguje v ďalšom príklade.
#include <iostream> using namespace std; int main() { int pole[] = {13,17,25,89,33}; int *pointerPole = pole; pointerPole = pointerPole+2; cout << "Treti prvok: " << *pointerPole << "\n"; pointerPole = pointerPole-1; cout << "Druhy prvok: " << *pointerPole << "\n"; return 0; }
Výsledok programu:
Treti prvok: 25 Druhy prvok: 17
V tomto príklade sme skúsili i znížiť adresu a to konkrétne takto: pointerPole-1;
. Všimnite si trochu mätúce priraďovanie napr. pointerPole = pointerPole+2;
. Musíte si uvedomiť, že najprv sa vyhodnotí to čo je vpravo od = a
až tak sa priradí výsledok do tej istej premennej, čiže k žiadnej kolízii nedôjde.
V ďalšom článku si ukážeme najčastejšiu chybu spojená so syntaxou pointerov a funkcie vracajúce pointery.
Námet na tento článok poslúžili tieto zdroje:
Pointers, cplusplus.com, dostupné online
6.8a — Pointer arithmetic and array indexing, learncpp.com, dostupné online