Linux E X P R E S

Facebook

Programovanie v jazyku C++: Pointery – Deklarácia pointerov (2)

cplusplus.png

Naučte sa deklarovať pointery. V článku si podrobne ukážeme rozdiel medzi adresou a hodnotou premennej, čo je pri pointeroch veľmi dôležité rozlišovať.


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.

Diskuze (1) Nahoru