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

Arduino Yún
Arduino Yún

Arduino YÚN je dokonalá doska, ktorá sa používa pri navrhovaní pripojených zariadení a vo všeobecnosti aj projektov internet vecí. Spája silu Linuxu s používaním Arduino...

Čítať viac...

Rezistor
Rezistor

Rezistor (odpor) je pasívny prvok. Používa sa vo všetkých elektrických obvodoch. Základnou vlastnosťou rezistora je jeho odpor. Odpor je fyzikálna vlastnosť, ktorá je daná štruktúrou materiálu a jeho rozmermi. Rezistory používané v elektrotechnike sú...

Čítať viac...

Arduino Leonardo
Arduino Leonardo

Arduino Leonardo dizajnovo nadväzuje na Arduino Uno. Líši sa však použitým čipom a tým je ATmega32u4. Mikrokontrolér ATmega32u4 má vstavané USB rozhranie, takže pre komunikáciu s počítačom už nie je potrebné používať ďalšie špeciálne obvody. Leonardo sa k pripojenému počítaču môže javiť...

Čítať viac...

Obľúbené produkty...

Keyestudio CAN-BUS Shield MCP2515

19.10 EUR

13.75 EUR

Keyestudio ESP32 Learning Kit

119.72 EUR

62.26 EUR

Keyestudio Sensor Kit 48 in 1

84.41 EUR

60.78 EUR

Keyestudio ESP32 Sensor Kit 42 in 1

163.81 EUR

85.19 EUR

Keyestudio 1602LCD Keypad Shield

19.69 EUR

13.78 EUR

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

    Teraz si ukážeme, aké ďalšie matematické funkcie a operácie podporuje Arduino okrem sčítavania, o...

  • Adresové operátory

    Adresové operátory označované aj ako ukazovatele (anglicky pointer, česky ukazovateľ, slovensky s...

  • Logické operátory

    Logické operátory sú && || ! (and or a not). Vykonávajú výpočet logických výrazov tvorených ich o...

  • Globálne premenné

    Premenné aj funkcie majú svoj rozsah platnosti, čiže oblasť, v ktorej fungujú a v ktorej nie. Vid...

  • 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
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