Deklarácia pointeru
Povedali sme si v minulom článku, že pointer je premenná uchovávajúca adresu inej premennej. Nad týmto poznatkom treba rozmýšľať aj pri deklarácii pointeru. Pozrime sa, ako deklarovať pointer.
#include <iostream> using namespace std; int main() { int cislo = 55; int *cislo1; cislo1 = &cislo; cout << "Adresa pointeru cislo1: " << cislo1 << " a hodnota pointeru: " << *cislo1 << "\n"; return 0; }
Výsledok programu je nasledovný:
Adresa pointeru cislo1: 0x6dfef8 a hodnota pointeru: 55
Ak chceme vypísať hodnotu premennej na ktorú ukazuje pointer, tak využijeme znak *
. Tento znak predstavuje dereferenčný operátor. Dereferenčný operátor priamo ukazuje na hodnotu premennej. Znak &
predstavuje adresu operátora a jeho aplikáciou dostaneme adresu premennej.
Deklaráciu pointeru vieme napísať aj do jedného riadku.
#include <iostream> using namespace std; int main() { int cislo = 55; int *cislo1 = &cislo; cout << "Adresa pointeru cislo1: " << cislo1 << " a hodnota pointeru: " << *cislo1 << "\n"; return 0; }
Takáto deklarácia môže byť trochu mätúca, pretože nás nabáda k tomu, aby sme si mysleli, že sme adresu uložili do hodnoty pôvodnej premennej. Ale treba si uvedomiť, že znak na deklaráciu pointeru je rovnaký ako dereferenčný operátor, ktorým pristupujeme priamo k premennej.
Ak vieme priradiť pointeru adresu, vieme ovplyvniť aj hodnotu premennej? A zmení to i hodnotu pôvodnej premennej? Poďme sa nato pozrieť.
#include <iostream> using namespace std; int main() { int cislo = 55; int *cislo1 = &cislo; *cislo1 = 66; cout << "Hodnota pointeru: " << *cislo1 << " a hodnota povodnej premennej: " << cislo << "\n"; return 0; }
Výsledok:
Hodnota pointeru: 66 a hodnota povodnej premennej: 66
Pointer je len odkaz na premennú, ktorý môže k nej priamo pristupovať. Takže ak priradíme pointeru novú hodnotu, priradíme tým novú hodnotu odkazovanej premennej.
Čo ak by sme pomýlili a miesto adresy chceme dať len číselnú hodnotu. Bude to veľký problém?
#include <iostream> using namespace std; int main() { int cislo = 55; int *cislo1 = &cislo; cislo1 = 66; cout << "Hodnota pointeru: " << *cislo1 << " a hodnota povodnej premennej: " << cislo << "\n"; return 0; }
Výsledok bude chybná hláška.
Skúsme okabátiť pointer a priradíme adresu ako definované číslo bunky pamäte.
#include <iostream> using namespace std; int main() { int cislo = 55; int *cislo1 = &cislo; cislo1 = 0x6dfef8; cout << "Hodnota pointeru: " << *cislo1 << " a hodnota povodnej premennej: " << cislo << "\n"; return 0; }
Opäť vyhodí chybu! Takže je dôležite si uvedomiť, čo je priamy prístup k premennej a čo adresa premennej. Môžme to i takto zapísať:
*pointer = 55
je ekvivalentné s a = 55
pointer
je ekvivalentné s &a
Teraz si položme otázku, či môže pointer priradiť adresu premennej ďalšiemu pointeru?
#include <iostream> using namespace std; int main() { int cislo = 55; int *cislo1 = &cislo; int *cislo2; cislo2 = cislo1; cout << "Hodnota pointeru: " << *cislo1 << "\nHodnota povodnej premennej: " << cislo << "\nHodnota druheho pointeru: "<<*cislo2<<"\n"; return 0; }
Výsledok:
Hodnota pointeru: 55 Hodnota povodnej premennej: 55 Hodnota druheho pointeru: 55
Zistili sme, že sa to dá. A čo samotné hodnoty? Priradí jeden pointer druhému hodnotu nejakej premennej? Na overenie tejto skutočností budeme potrebovať dve premenné a každá premenná bude mať svoj pointer. Dokážeme potom v priebehu programu s pomocou jedného pointeru zmeniť hodnotu druhej premennej?
#include <iostream> using namespace std; int main() { int num1 = 101; int num2 = 44; int *cislo1 = &num1; int *cislo2 = &num2; cout << "Pred:\nPremenna num1: " << num1 << "\nPremenna num2: " << num2 << "\nPointer cislo1: " << *cislo1 << "\nPointer cislo2: " << *cislo2 << "\n"; *cislo2 = *cislo1; cout << "\nPo:\nPremenna num1: " << num1 << "\nPremenna num2: " << num2 << "\nPointer cislo1: " << *cislo1 << "\nPointer cislo2: " << *cislo2 << "\n"; return 0; }
Výsledok:
Pred: Premenna num1: 101 Premenna num2: 44 Pointer cislo1: 101 Pointer cislo2: 44 Po: Premenna num1: 101 Premenna num2: 101 Pointer cislo1: 101 Pointer cislo2: 101
V budúcom dieli sa pozrieme na pointerovú aritmetiku v súvislostí s poliami.