Ukazatel (programování): Porovnání verzí

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
m link fix
Formulace úvodu
Řádek 1: Řádek 1:
'''Ukazatel''' (angl. ''pointer'') je [[datový typ]], který slouží k uložení [[Adresa (programování)|adresy]] v [[operační paměť|paměti počítače]].
'''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 (informatika)|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ů.
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á [[adresa (programování)|adresa]] dělená na [[adresa (programování)#Operační paměť|segment a offset]], je možné volit mezi dvěma typy ukazatelů:
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 (programování)|Adresovatelnou]] jednotkou ukazatele může být jeden [[byte]] 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.
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 [[pole (informatika)|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]].
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)