VUT- nakladatelství Vutium
přejít na obsah přejít na navigaci

Linux E X P R E S, Programovanie v jazyku C++: Pointery – Deklarácia pointerov (2)

Canon

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ť.


reklama

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.

Nahoru

Příspěvky

Programovanie v jazyku C++: Pointery – Deklarácia pointerov (2)
m 19. 10. 2018, 19:53:53
Odpovědět  Odkaz 
Pekny clanek, diky za nej.

Tady je to krasne vysvetleno i graficky: http://www.cplusplus.com/doc/tutorial/pointers/

Přidat názor

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz

Eduard Boldižár

Eduard Boldižár

Som redaktorom stránky astrotech.cz. Mám 24 rokov. Čas trávim v IT škole. Medzi moje záľuby patrí astronómia, sci-fi literatúra a programovanie.


  • Distribuce: ubuntu
  • Grafické prostředí: unity



Public Relations

Zabezpečení DNSSEC a česká doména

DNSSECChcete mít vlastní doménu a záleží vám nejen na kvalitním obsahu a profesionální prezentaci vlastní značky, ale také na jistotě zabezpečení domény? Chcete vědět, jaké zabezpečení zabraňuje podvržení stránek a která doména je důvěryhodná? Vše vám napoví zabezpečení DNSSEC.

Pokračování ...


Redakční blog

Redakce

Redakce, 21. prosinec

Pište pro LinuxEXPRES

Baví vás Linux? Pište o něm, není to nic těžkého. LinuxEXPRES hledá nové autory.


Pavel Fric

Pavel Fric, 23. říjen

Nové motivy pro přehrávač Sayonara

Pomozte rozšířit možnost měnit vzhled programu za běhu


Pavel Fric

Pavel Fric, 28. únor

Lollypop


Všechny blogy »

Onlio