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

Výpočet predradného rezistoru pre LED
Výpočet predradného rezistoru pre LED

Výpočet predradného rezistoru pre LED diódu pre bežného elektrotechnika nie je nič zložité. Tým ostatným, čo nevedia ako na to, sa to pokúsim vysvetliť v nasledujúcich riadkoch s niekoľkými obrázkami a kalkulačkou. Pôvodne bol nápad uviesť sem tabuľku s farbami LED diód, no pri vzhliadnutí niekoľkých katalógov som dospel k...

Čítať viac...

Dallas DS18B20 – meranie teploty
Dallas DS18B20 – meranie teploty

Ďalší vynikajúci senzor na meranie teploty je Dallas DS18B20. V článku popisujem jeho parametre, dva spôsoby napájania, vnútornú pamäť (registre) a samozrejme zapojenie s Arduinom, jednoduchý program a nejaké fotky. Teplotný senzor (alebo tiež čidlo) DS18B20 od firmy Maxim (predtým Dallas) je v Arduino komunite veľmi obľúbené. Za veľmi dobrú cenu umožňuje...

Čítať viac...

KiCad je nástroj pre návrh schémy a plošných spojov
KiCad

Program KiCad je open source nástroj určený pre návrh schém a plošných spojov. Jeho využitie je založené na tom, že umožňuje inžinierom a elektronikom vytvárať vlastné...

Čítať viac...

Obľúbené produkty...

Keyestudio ESP32 Smart Home Kit

129.79 EUR

58.41 EUR

Keyestudio MEGA 2560 R3 Development Board

33.32 EUR

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

  • Zložené operátory

    Použitie zložených priraďovacích operátorov zjednodušuje a sprehľadňuje zdrojový kód, no použitie...

  • Ostatné IO funkcie

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

  • Špeciálne operátory

    Spomenieme ešte špeciálne operátory alebo špeciálne znaky, ktoré sa používajú pri programovaní a ...

  • Dátové typy

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

Podpora webu
Na kávu už prispeli
Dátum Meno Suma
22.03.2025 Radoslav Kopera 5€
30.12.2024 Jozef Greš 5€
20.10.2024 Radovan Nosáľ 20€
02.10.2024 Milan Durkoš 10€
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