Ukazatele
C++ 11

image_printTisk

V tomto článku si představíme nový pojem ukazatel jako proměnnou obsahující adresu na jinou oblast paměti. Seznámíme se dvěma operátory při související s adresací a na závěr si ukážeme, jak inicializovat ukazatel, který nedrží odkaz na žádnou proměnnou či jinou oblast paměti.

Pojem ukazatel bych volně definoval jako proměnnou, co obsahuje hodnotu vyjadřující adresu v paměti na proměnnou jinou, nebo adresu odkazující na nějakou datovou oblast. Rozlišujeme v zásadě dva typy ukazatelů. Prvním je ukazatel na konkrétní datový typ, druhým je ukazatel bez uvedení datového typu odkazující obecně na cokoliv, jakýkoliv úsek paměti počítače. Ukažme si deklarace ukazatelů na příkladu.

int main() {
    int *pCislo;            // ukazatel na celočíselný typ int
    double *pCislo2;        // ukazatel na datový typ double
    void *pObecnyUkazatel;  // ukazatel bez uvedení konkrétního datového typu

    return 0;
}

Na příkladu je vidět, že deklarace ukazatele začíná uvedením konkrétního datového typu. Po té následuje znak “hvězdička” a dále pak již identifikátor. Proměnné pCislo a pCislo2 jsou deklarovány jako ukazatele na konkrétní číselné datové typy, ale proměnná pObecnyUkazazatel je deklarována pomocí klíčového slova void, která v jazyce C++ má význam “bez hodnoty”. Uvedením klíčového slova void u ukazatele tedy říkáme, že příslušný datový typ neznáme nebo že daný ukazatel může být použit pro více druhů odkazových datových typů.

Nabízí se otázka, k čemu jsou ukazatele v C++ dobré. Použití ukazatelů uvedu jen ve stručnosti, neboť je jedná o rysy jazyka C++, které budou vysvětleny až v následujících kapitolách, ve kterých se k ukazatelům ještě vrátíme. Jsou to například následující:

  • Ukazatel může sloužit jako jeden ze způsobů předávání hodnot do funkce odkazem.
  • Ukazatelé se používají pro odkazování na objekty a jiné datové typy alokované na dynamické paměti.
  • Ukazatele lze použít při práci s poli.

Abychom mohli ukazatele používat, musíme mít nějakou možnost získat adresu na danou proměnnou a rovněž musí být možné se nějakým způsobem dostat přes ukazatel k hodnotě, kterou odkazovaná proměnná obsahuje. K tomu slouží dva operátory. Prvním je operátor “&”, který, pokud je uveden před identifikátorem, vrací adresu v paměti, kterou identifikátor reprezentuje. Druhým je operátor “*”, který slouží k zápisu či čtení hodnoty pomocí ukazatele. Ukažme si nejlépe vše na příkladu.

int main() {
    int cislo = 5;
    
    int* pCislo;
    pCislo = &cislo;    // Do proměnné "pCislo" přirazujeme adresu proměnné "cislo"

    *pCislo = 2;        // Nastavujeme hodnotu proměnné "cislo" přes ukazatel, nyní je hodnota 2

    int *pCislo2 = pCislo;  // Deklarujeme nový ukazatel "pCislo2", který je iniciazován rovněž na adresu proměnné "cislo"    
    *pCislo2 = 10;          // Nyní je hodnota proměnné "cislo" rovna 10

    return 0;
}

První inicializujeme proměnnou cislo na hodnotu pět. Po té je deklarován ukazatel pCislo a je mu přiřazena adresa proměnné cislo pomocí operátoru “&”. Následuje přiřazení hodnoty dva do proměnné cislo za pomocí ukazatele pCislo aplikací operátoru “*”. Následně deklarujeme nový ukazatel pCislo2 inicializovaný rovněž na adresu proměnné cislo, přes který pak adresované proměnné přiřadíme hodnotu deset.

Pokud chceme vyjádřit, že ukazatel neukazuje na žádnou oblast paměti, lze použít klíčové slovo nullptr. Viz následující ukázka kódu.

int main() {
    int *p = nullptr;
    return 0;
}

Na tomto příkladu je ukazateli jménem p přiřazena “žádná” adresa pomocí klíčového slova nullptr. Jedná se o preferovaný způsob vyjádření, že ukazatel neobsahuje žádnou adresu proti staršímu vyjádření pomocí makra NULL, které je spíše v dnešní době historickým pozůstatkem táhnoucím se z jazyka C a má význam jej používat jen při údržbě staršího software. V některých případech, hlavně při generickém programování, může být i použití makra NULL příčinou víceznačnosti kódu. Klíčové slovo nullptr má syntaktickou výhodu, že může být přiřazeno jen ukazatelům, a ne třeba datovým typům reprezentující čísla, apod.

image_printTisk
Ukazatele
C++ 11
Ohodnoťte tento článek

Související články

  • Pole v C++ V tomto článku si vysvětlíme nový pojem jazyka C++, a to pole nějakých hodnot. Je to jazykový konstrukt, který slouží k uchování seznamu hodnot nějakého datového typu. Je důležité zmínit, […]
  • Aritmetika ukazatelů a pole V tomto článku si vysvětlíme, co je aritmetika ukazatelů. Ukážeme si význam a aplikaci dalších operátorů vztahujících se k ukazatelům a popíšeme si jejich vzájemné vztahy k polím různých […]
  • Metody vracení hodnot z funkce DO POKROČILÝCH ASI Tento článek pojednává o způsobech vracení hodnot z funkcí. Jsou to stejné způsoby, o kterých je psáno ve článku předchozím, tedy vracení hodnotou nebo vracení […]
  • Vícerozměrná pole Tento článek pojednává o vícerozměrných polích v jazyce C++. Seznámíme se s jejich významem, deklarací, inicializací a způsobem zápisu a čtení jejich hodnot. Na závěr článku bude zmíněno, […]
  • Předávání a vracení polí z funkcí DO POKROČILÝCH TÉMAT Tento článek pojednává o práci s poli a funkcemi. Popisuje rozličné metody, jak předat pole jako argument funkci a také jak pole z funkce vrátit. Existují v […]
  • Komentáře Tento článek pojednává o způsobu zápisu komentářů ve zdrojových kódech jazyka C++. Budou popsány oba druhy komentářů, tedy jednořádkové i jejich víceřádková varianta. Použití […]