Home >> C++ návod >> Ukazatele - 1.část

Ukazatele - 1.část

Na konci minulé lekce padla zmínka o tzv. ukazatelích. V dnešní lekci se těmto ukazatelům budeme věnovat naplno. Ukážeme si jak fungují a naučíme se je používat. Vzhledem k tomu, že jsou ukazatele poměrně obsáhlou kapitolou, rozdělíme si ji na dvě části. V této části se zaměříme na základní princip ukazatelů.

Jelikož problematika ukazatelů úzce souvisí s proměnnými, pojďme si nejprve trochu zopakovat to co již známe:

char znak;

V této ukázce jsme deklarovali proměnnou znak typu char, čímž jsme v operační paměti počítače vytvořili místo o velikosti 1B do kterého lze uložit jeden libovolný znak. Toto místo je označeno tzv. identifikátorem, díky němuž mužeme k této paměti kdykoliv přistupovat.

Díky identifikátorům tedy nemusíme znát skutečné fyzické umístění dat v operační paměti počítače. V dnešní lekci se však tímto problémem budeme zabývat, proto si pojďme vysvětlit, jak je paměť počítače realizována.

Paměť počítače je tvořena poslupností jednotlivých buněk, kde každá z těchto buněk představuje 1B celkové paměti a je označena unikátní adresou (číslem). Díky této adrese lze konkrétní buňky paměti snadno vyhledat.

Proměnnou znak z předchozí ukázky si můžeme v operační paměti představit následovně:

znak

Jelikož proměnná typu char má velikost 1B, zabere jednu buňku paměti. Tato buňka má svou unikátní adresu - 100.

Poznámka: Na obrázku jsou použity fiktivní adresy buněk pro lepší představu.

Pokud tedy nadeklarujeme nějakou proměnnou (například typu float), bude tomuto účelu přiřazen požadovaný počet buněk na konkrétním místě v operační paměti (v našem případě 4B tedy 4 buňky). Tomuto konkrétnímu místu říkáme adresa paměti. Právě na základě těchto adres pracují ukazatele.

Deklarace ukazatele

Ukazatel je ve skutečnosti něco jako proměnná. Rozdíl je ovšem v tom, že zatímco klasická proměnná představuje místo pro uložení nějaké hodnoty, ukazatel slouží k uložení adresy na jinou proměnnou. Podívejme se jak takový ukazatel nadeklarovat:

int *pepe;

Deklarace ukazatele je skutečně velmi podobná deklaraci proměnné. Jedinou odlišností je hvězdička (*), která předchází identifikátor ukazatele. Co je však stejné, je pravidlo datového typu. Tak jako do proměnné typu char nemůžeme uložit číslo, stejně tak ukazatel typu char nemůže odkazovat na proměnnou jiného typu.

Pokud chceme deklarovat více ukazatelů stejného typu, můžeme použít zkrácenou formu zápisu:

int *pepe, *adam, *tom;

Operátor reference - &

Ve chvíli kdy deklarujeme ukazatel, vznikne v paměti místo pro uložení odkazu na nějakou proměnnou. Odkaz se však nepřiřadí samovolně, musíme jej přiřadit ručně pomocí přiřazovacího příkazu. Nyní je však potřeba uvědomit si, že nebudeme přiřazovat obsah proměnné, ale její adresu. Proto použijeme operátor reference - & (ampersand):

int *pepe, adam;
pepe = &adam;

V této ukázce jsme nejprve deklarovali ukazatel pepe a proměnnou adam. Dále jsme pomocí přiřazovacího příkazu uložili do ukazatele pepe adresu na proměnnou adam. Ukazatel pepe nyní tedy odkazuje na proměnnou adam.

Podívejme se na další příklad. Co bude obsahem prvků pepe, adam a tom?

int *pepe, adam, tom;
adam = 77;
tom = adam;
pepe = &tom;

Tak tedy pěkně popořadě. Nejprve jsme deklarovali ukazatel pepe a dvě proměnné adam a tom.

ukazatel

Následně byla proměnné adam přiřazena hodnota 77:

ukazatel

V dalším kroku jsme proměnné tom přiřadili hodnotu proměnné adam:

ukazatel

Nakonec jsme ukazateli pepe přiřadili adresu proměnné tom:

ukazatel

Operátor dereference - *

Již víme, že funkcí ukazatele je ukazovat na jinou proměnnou. Zatímco operátor reference umožňoval uložit do ukazatele adresu proměnné, operátor dereference umožňuje přistoupit k hodnotě proměnné, na kterou ukazatel ukazuje.

Operátor dereference je reprezentován hvězdičkou (*), kterou píšeme bezprosředně před ukazatel. Příklad:

int *pepe, adam;
adam = *pepe;

V tomto případě bude do proměnné adam přiřazena hodnota proměnné na kterou odkazuje ukazatel pepe. Pro lepší představu si uvedeme kompletní příklad:

#include <iostream>
using namespace std;

int *pepe, adam, tom;

int main ()
{
tom = 77;
pepe = &tom;
adam = *pepe;
cout << adam;
}

V ukázce jsou deklarovány dvě proměnné (adam, tom) a ukazatel pepe. Pojďme si popsat hlavní funkci programu:

1. Proměnné tom je přiřazena hodnota 77.

dereference

2. Ukazateli pepe je přiřazena adresa proměnné tom. Ukazatel pepe nyní na tuto proměnnou odkazuje.

dereference

3. Proměnné adam je přiřazena hodnota proměnné, na kterou odkazuje ukazatel pepe - tedy hodnota proměnné tom.

dereference

4. Nakonec jsme nechali vypsat hodnotu proměnné adam.

77

Příklad

Na závěr si ukážeme ještě jeden příklad:

#include <iostream>
using namespace std;

int x,y;
int *ukazatel;

int main ()
{
ukazatel = &x;
*ukazatel = 25;
ukazatel = &y;
*ukazatel = 100;
cout << "Hodnota x: " << x << endl;
cout << "Hodnota y: " << y << endl;
return 0;
}

V tomto příkladu máme deklarovány dvě proměnné a jeden ukazatel. V hlavní funkci programu nejprve přiřadíme ukazateli odkaz na proměnnou x. Poté této proměnné přiřadíme hodnotu 25 za pomoci ukazatele, který na tuto proměnnou odkazuje. Následně necháme ukazatel odkazovat na proměnnou y a stejným způsobem jí přiřadíme hodnotu 100. Nakonec hodnoty obou proměnných výpíšeme na obrazovku:

Hodnota x: 25
Hodnota y: 100
Všimněte si, že jsme pro obě proměnné ani jednou nepoužili přiřazovací příkaz a přesto jim byly přiřazeny hodnoty.

Tato lekce pokračuje druhou částí, kde si ukážeme další vlastnosti ukazatelů a podíváme se na speciálni typy ukazatelů.

C++ Návod
Úvod do C++
Volba programu
Struktura programu
Proměnné
Konstanty
Operátory
Vstup a výstup
Řídící struktury
Funkce - 1.část
Funkce - 2.část
Pole
Práce s textovými řetězci
Ukazatele - 1.část
Ukazatele - 2.část
Dynamické proměnné
Datové struktury
©2008 - 2011 Klikzone.cz
Ráj aut - inzerce nových i ojetých aut