Adresové operátory

Adresové operátory označované aj ako ukazovatele (anglicky pointer, česky ukazovateľ, slovensky smerník) sú jedným zo zložitejších tém pre začiatočníkov. Avšak pre manipuláciu určitých dátových štruktúr môže použitie ukazovateľov zjednodušiť kód.


* (dereferencia)

Prvým a možno povedať, že najzložitejším, ale súčasne aj najmocnejším odvodeným typom je ukazovateľ, tak isto označovaný ako smerník (pointer). Oba názvy sú ekvivalentné – ktorý z nich budete používať, je otázka vkusu. Na efektívne programovanie je veľmi dôležité dôkladne pochopiť princíp práce s ukazovateľmi, už aj z toho dôvodu, že spôsobujú najväčšie percento programových chýb.

Čo je to vlastne ukazovateľ? Typ ukazovateľ je vždy združený s nejakým iným typom, na ktorého inštanciu „ukazuje” (a nemusí to by len jeden zo základných typov). Premenná typu ukazovateľ obsahuje adresu miesta uloženia tejto inštancie v pamäti.

Uveďme si príklad: máme premennú a typu int, ktorej hodnota (obsah) je napríklad 10. Nech je táto premenná umiestnená na adrese 0x0028FBFC. Potom obsah inej premennej p typu „ukazovateľ na int“, ukazujúcej na premennú a (ktorá je typu int), bude práve 0x0028FBFC.

Adresové operátory pointer ukazovateľ smerník

Deklarácia premennej typu ukazovateľ na nejaký základný typ je veľmi jednoduchá. Medzi názov typu a názov premennej vložíme znak * (hviezdička).

int a = 10;    // premenná a je typu int s priradenou hodnotu 10 
int* p = &a;   // premenná p je typu ukazovateľ na int s priradenou referenciou na a (& získa adresu a)

& (referencia)

Ďalším odvodeným typom, o ktorom si povieme, je referencia (reference). Občas sa možno stretnúť aj s názvom referenčný typ (tento typ v jazyku C neexistuje a objavuje sa až v C++).

Tento operátor & je unárny. Ako už názov adresový operátor napovedá, umožňuje získať adresu objektu, na ktorý je aplikovaný. Adresu objektu môžeme použiť v najrôznejších situáciách, obvykle je to ale v súvislosti s ukazovateľmi. Bez tohoto operátoru by sme neboli schopní pracovať so súbormi a ani štandardný vstup by sme neboli schopní čítať inak, než po znakoch.

Referencia je veľmi podobná ukazovateľu a zjednodušene môžeme povedať, že je to ukazovateľ, ktorý sa automaticky dereferencuje. Obsahom premennej typu referencia je takisto adresa inej premennej, ale navonok sa referencia javí ako normálna premenná daného typu. Tak ako ukazovateľ aj referencia je združená s nejakým iným typom – hovoríme, že ide o referenciu na daný typ.

Deklarácia referencie

je podobná deklarácii ukazovateľa, len namiesto znaku * vložíme medzi typ a meno premennej znak & (tzv. ampersand).

int a = 10;   // premenná a je typu int s priradenou hodnotu 10 
int& p = a;   // premenna p je typu referencia na int s uloženou adresou na a

Všimnime si, že referenciu je potrebné inicializovať menom existujúcej premennej, nie je správny napríklad nasledujúci zápis:

int& p = 10;

Prekladač síce pri preklade tohto riadka v mnohých prekladačoch neohlási chybu, ale (podľa nastavenia) vydá varovanie (warning), že na inicializáciu referencie bola použitá pomocná (dočasná – temporary) premenná, ktorej hodnota sa nastavila na 10. Dostaneme tak referenciu na premennú, ktorú sme vôbec nedeklarovali a ktorú pravdepodobne ani nechceme.

Po inicializácii už nie je nijakým spôsobom možné zmeniť referenciu tak, aby odkazovala na inú premennú. Referenčná premenná sa ďalej správa úplne rovnako ako premenná s ňou združená, to znamená, že každá operácia s referenciou mení v skutočnosti premennú, na ktorú referencia odkazuje:

int x = 1;   
int& rx = x;
printf("x = %i", x);
rx = 2;
printf("x = %i", x);

Po prebehnutí tohto úseku programu sa na štandardnom výstupe objaví:

x = 1   
x = 2

Z toho je zrejmé, že zmena premennej rx sa rovnako dotkla aj premennej x.

Referenčná premenná slúži teda ako nejaký „alias”, pomocou ktorého sa môžeme odvolávať na inú premennú. Na tomto mieste sa sluší podotknúť, že deklarácia a používanie referencií priamo v tele funkcií sa prakticky obmedzuje na niekoľko málo situácií, ako napríklad práca s nejakou (z hľadiska zápisu) komplikovane prístupnou premennou – namiesto vypisovania siahodlhých reťazcov pri opakovanom prístupe k tejto premennej si jednoducho deklarujeme referenciu s krátkym a rozumným menom, ktorá na túto premennú odkazuje. Skutočná výhoda referencií sa však ukáže až pri ich používaní ako typu argumentov funkcie alebo návratovej hodnoty. Ale k tomuto sa dostaneme až pri rozprávaní o funkciách.

Tento text je preložený a upravený zo stránok arduino.cc pod licenciou Creative Commons Attribution-ShareAlike 3.0.

Výber na čítanie...

Atmel Studio 7
Atmel Studio 7

Firma Atmel vydala novú verziu svojho editora Atmel Studio 7. Pre nás fanúšikov Arduina je to dobrou správou, pretože sa viac sústreďuje na Arduino. Nové možnosti sú aj v oblasti moderných 32-bitových mikrokontrolérov. Úžasné na Atmel Studiu je aj to, že nepotrebujete mať ...

Čítať viac...

Arduino UNO
Arduino UNO

Arduino Uno je v súčasnej dobe asi najčastejšie používaný typ dosky. Je priamym pokračovateľom hlavnej vývojovej línie, ktorá začala prvým Arduinom so sériovým portom namiesto USB, pokračujúce cez Arduino Extreme, NG, Diecimila a Duemilanove až k dnešnému Uno. Na doske nájdeme...

Čítať viac...

Ako (ne)zničiť Arduino
Ako (ne)zničiť Arduino

Čo by si mal vedieť pri zapájaní Arduina a jeho pinov? Určite aspoň to, ako nezničiť Arduino. Nasledujúci súpis zverejňujem preto, aby si sa popísaným chybám mohol vyhnúť. Jedná sa skôr o elektronické...

Čítať viac...

Obľúbené produkty...

Keyestudio Nano IO Shield

9.26 EUR

9.26 EUR

Vyhľadať články
Programovanie...
  • Ostatné IO funkcie

    U Arduina je možné generovať i zvuk, ale iba v najjednoduchšej podobe. Neumožňuje totiž generovať...

  • Konštanty

    Konštanty sú symboly reprezentujúce nemennú číselnú alebo inú hodnotu. Prekladač jazyka im prirad...

  • Goniometrické funkcie

    Goniometrické funkcie v matematike označuje termín používaný pre jednu zo šiestich funkcií veľkos...

  • Dátové typy

    Celočíselné dátové typy môžu obsahovať modifikátory unsigned respektíve signed, čím môžeme požado...

  • Operátory preprocesora

    Operátory preprocesora alebo znak # je signálom pre preprocesor. Preprocesor sa spustí pri každom...

Podpora webu
Na kávu už prispeli
Dátum Meno Suma
08.01.2024 Veres Dusan 10€
15.05.2023 Ivan Danis 10€
28.09.2022 Ivan Vrab 7€
14.05.2022 Nemcic Marian 10€
04.02.2022 Robert Bilko 5€
29.01.2022 Peter Buffa 5€
19.11.2021 Rastislav Rehak 5€
16.09.2021 Anton Strela 5€
13.09.2021 Juraj Jedlak 5€
02.09.2021 Michal Marek 7€
08.08.2021 František Uhrík 5€
21.07.2021 Juraj Hrdina 5€
25.03.2021 Jan Nemec 10€
16.03.2021 Igor Pavlov 5€
25.02.2021 Lukas Lacuch 5€
06.11.2020 Pavol Balint 5€
05.11.2020 Marek Horečný 5€
05.10.2020 Jan Kusnir 5€
27.04.2020 Jan Zuskin 15€
26.04.2020 Dušan Sojka 5€
24.02.2020 Juraj Lackanič 5€
22.01.2020 František Žilinec 10€
20.05.2018 Tomáš F. 2€
17.12.2018 Pavol P. 5€
QR Donate 10Eur