Ukazatel (programování): Porovnání verzí
m link fix |
Formulace úvodu |
||
Řádek 1: | Řádek 1: | ||
'''Ukazatel''' ( |
'''Ukazatel''' ({{Vjazyce2|en|''pointer''}}) je v [[Informatika|informatice]] označení pro [[datový typ]], který slouží k uložení [[Adresa (informatika)|adresy]] v [[operační paměť|paměti počítače]]. Ukazatel slouží pro zpřístupnění [[Data|dat]], která jsou na příslušné adrese v operační paměti uložena. |
||
== Charakteristika == |
|||
Ukazatel používá většina [[Imperativní programování|imperativních]] [[programovací jazyk|programovacích jazyků]], jako např. [[C (programovací jazyk)|jazyk C]] a [[Pascal (programovací jazyk)|Pascal]]. V programovacích jazycích je syntaxí zápisu programu rozlišeno, zda se pracuje s hodnotou adresy ukazatele anebo s hodnotou datového prvku, na který ukazuje. |
Ukazatel používá většina [[Imperativní programování|imperativních]] [[programovací jazyk|programovacích jazyků]], jako např. [[C (programovací jazyk)|jazyk C]] a [[Pascal (programovací jazyk)|Pascal]]. V programovacích jazycích je syntaxí zápisu programu rozlišeno, zda se pracuje s hodnotou adresy ukazatele anebo s hodnotou datového prvku, na který ukazuje. |
||
Zvláště významný je tento datový typ v [[C (programovací jazyk)|jazyku C]], který definuje i tzv. ''pointerovou aritmetiku'' (viz níže), díky které lze např. provést výpočet adres různých prvků v [[Pole ( |
Zvláště významný je tento datový typ v [[C (programovací jazyk)|jazyku C]], který definuje i tzv. ''pointerovou aritmetiku'' (viz níže), díky které lze např. provést výpočet adres různých prvků v [[Pole (datová struktura)|poli]], nebo naopak z jejich adresy odvodit jejich index. Jazyk C téměř nerozlišuje mezi ukazatelem a polem a dokonce nemá ani datový typ [[Textový řetězec|řetězec]] a nahrazuje jej právě ukazatelem na jeho počátek, resp. s ním pracuje jako s polem znaků. |
||
Při používání ukazatelů často dělají programátoři mnoho [[programátorská chyba|programátorských chyb]]. V novějších programovacích jazycích, jako například [[Java (programovací jazyk)|Java]] a [[Python]], jsou proto ukazatele nahrazeny [[Reference (programování)|referencemi]] na [[objektově orientované programování|objekty]], jejichž použití není tolik náchylné k programátorským chybám. |
Při používání ukazatelů často dělají programátoři mnoho [[programátorská chyba|programátorských chyb]]. V novějších programovacích jazycích, jako například [[Java (programovací jazyk)|Java]] a [[Python]], jsou proto ukazatele nahrazeny [[Reference (programování)|referencemi]] na [[objektově orientované programování|objekty]], jejichž použití není tolik náchylné k programátorským chybám. |
||
== Typy ukazatelů == |
== Typy ukazatelů == |
||
V architektuře procesorů [[x86]], kde se používá [[ |
V architektuře procesorů [[x86]], kde se používá [[Adresa (informatika)|adresa]] dělená na [[Adresa (informatika)#Operační paměť|segment a offset]], je možné volit mezi dvěma typy ukazatelů: |
||
* '''blízký ukazatel''' (near pointer) – obsahuje jen lineární adresu (offset), a neobsahuje identifikaci (číslo) segmentu |
* '''blízký ukazatel''' (near pointer) – obsahuje jen lineární adresu (offset), a neobsahuje identifikaci (číslo) segmentu |
||
* '''vzdálený ukazatel''' (far pointer) – obsahuje identifikaci (číslo) segmentu i lineární adresu (offset) |
* '''vzdálený ukazatel''' (far pointer) – obsahuje identifikaci (číslo) segmentu i lineární adresu (offset) |
||
Řádek 15: | Řádek 16: | ||
== Pointerová aritmetika == |
== Pointerová aritmetika == |
||
Pointerová aritmetika definuje možné výpočetní operace s ukazateli. [[Adresa ( |
Pointerová aritmetika definuje možné výpočetní operace s ukazateli. [[Adresa (informatika)|Adresovatelnou]] jednotkou ukazatele může být jeden [[bajt]] nebo jedno [[slovo (paměťová jednotka)|slovo]], ale nejčastěji ve [[programovací jazyk|vyšších programovacích jazycích]] je adresovatelnou jednotkou ukazatele velikost [[datový typ|datového typu]], který ukazatel adresuje. |
||
Možné operace s ukazateli jsou buď přírůstek adresy P (čili indexace prvků v [[ |
Možné operace s ukazateli jsou buď přírůstek adresy P (čili indexace prvků v [[Pole (datová struktura)|poli]], na jehož počátek P ukazuje), anebo rozdíl adres P (vzdálenost dvou prvků v poli). Obě tyto operace pracují v násobcích velikosti [[datový typ|datového typu]]. |
||
Adresy ukazatelů se kterými se provádí pointerová aritmetika se musí nacházet ve stejném adresovém prostoru (např. poli), jinak nemusí být výsledek operace definován. |
Adresy ukazatelů se kterými se provádí pointerová aritmetika se musí nacházet ve stejném adresovém prostoru (např. poli), jinak nemusí být výsledek operace definován. |
Verze z 19. 5. 2016, 16:04
Ukazatel (anglicky pointer) je v informatice označení pro datový typ, který slouží k uložení adresy v paměti počítače. Ukazatel slouží pro zpřístupnění dat, která jsou na příslušné adrese v operační paměti uložena.
Charakteristika
Ukazatel používá většina imperativních programovacích jazyků, jako např. jazyk C a Pascal. V programovacích jazycích je syntaxí zápisu programu rozlišeno, zda se pracuje s hodnotou adresy ukazatele anebo s hodnotou datového prvku, na který ukazuje.
Zvláště významný je tento datový typ v jazyku C, který definuje i tzv. pointerovou aritmetiku (viz níže), díky které lze např. provést výpočet adres různých prvků v poli, nebo naopak z jejich adresy odvodit jejich index. Jazyk C téměř nerozlišuje mezi ukazatelem a polem a dokonce nemá ani datový typ řetězec a nahrazuje jej právě ukazatelem na jeho počátek, resp. s ním pracuje jako s polem znaků.
Při používání ukazatelů často dělají programátoři mnoho programátorských chyb. V novějších programovacích jazycích, jako například Java a Python, jsou proto ukazatele nahrazeny referencemi na objekty, jejichž použití není tolik náchylné k programátorským chybám.
Typy ukazatelů
V architektuře procesorů x86, kde se používá adresa dělená na segment a offset, je možné volit mezi dvěma typy ukazatelů:
- blízký ukazatel (near pointer) – obsahuje jen lineární adresu (offset), a neobsahuje identifikaci (číslo) segmentu
- vzdálený ukazatel (far pointer) – obsahuje identifikaci (číslo) segmentu i lineární adresu (offset)
Tento způsob práce s pamětí (respektive segmentace paměti) se používal v dobách 16-bitových aplikací pro DOS, dnes je ale považován za zastaralý a na architektuře x86-32 se používá výhradně 32-bitových ukazatelů, respektive na 64-bitových architekturách se používá 64-bitových ukazatelů.
Pointerová aritmetika
Pointerová aritmetika definuje možné výpočetní operace s ukazateli. Adresovatelnou jednotkou ukazatele může být jeden bajt nebo jedno slovo, ale nejčastěji ve vyšších programovacích jazycích je adresovatelnou jednotkou ukazatele velikost datového typu, který ukazatel adresuje.
Možné operace s ukazateli jsou buď přírůstek adresy P (čili indexace prvků v poli, na jehož počátek P ukazuje), anebo rozdíl adres P (vzdálenost dvou prvků v poli). Obě tyto operace pracují v násobcích velikosti datového typu.
Adresy ukazatelů se kterými se provádí pointerová aritmetika se musí nacházet ve stejném adresovém prostoru (např. poli), jinak nemusí být výsledek operace definován.
Příklad v jazyku C:
int i; // definice proměnné i datového typu int
int a[3]; // definice proměnné a, pole typu int se třemi prvky
int *p; // definice proměnné p, ukazatele na datový typ int
p = &i; // hodnota pointeru je nastavena na adresu proměnné i
*p = 3; // do paměti na adresu odkazovanou ukazatelem p se uloží hodnota 3
p = &(a[2]); // hodnota pointeru je nastavena na prvek pole a s indexem 2
p = p - 2; // hodnota pointeru je nastavena na prvek pole a s indexem 0 (tj. první prvek pole)
*p = 5; // do paměti na adresu odkazovanou p se uloží hodnota 5 (tedy první prvek pole má tuto hodnotu)