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

Dióda
Dióda

Dióda je elektrotechnická súčiastka s dvoma elektródami, označovanými ako anóda a katóda, ktorá sa vyznačuje veľmi odlišným tvarom Volt-Ampérovej charakteristiky v závislosti na polarite priloženého napätia. Po pripojení anódy na kladnejšie napätie ako je na...

Čítať viac...

PlatformIO IDE - návod na inštaláciu
PlatformIO IDE – návod na inštaláciu

V tomto článku prinášam jednu z ďalších možností pre Arduino programovanie a to vývojové prostredie PlatformIO IDE. V tomto vývojovom prostredí si ukážeme jednoduchý príklad „Blink“. Okrem programovania Arduina ho možno použiť aj pre ďalšie podobné...

Čítať viac...

Arduino história
Arduino história

Arduino [čítaj Arduíno] je v informatike názov malého jedno-doskového počítača založeného na mikrokontroléri ATmega od firmy Atmel. Svojim návrhom sa snaží podporiť výučbu informatiky v školách a oboznámiť študentov s tým, ako sú pomocou počítačov riadené rôzne zariadenia ...

Čítať viac...

Obľúbené produkty...

Keyestudio Nano Development Board

6.92 EUR

6.92 EUR

Keyestudio ESP32 Basic Learning Kit

75.18 EUR

39.09 EUR

Keyestudio CAN-BUS Shield MCP2515

18.56 EUR

13.36 EUR

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

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

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

  • Matematické funkcie

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

  • Pomocné premenné

    Ako pomocné premenné môžeme využiť funkcie sizeof() a PROGMEM. Ich popis rozoberiem v tomto článku...

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