petod píše:mám otázku : k čemu použiju v praxi ukazatele kdybych chtěl později programovat v C , C++ ? vím že je to adresa v paměti ale k čemu mi bude?
Ono se to nezdá, ale ukazatele jsou zrovna v tom Céčku to úplně nejdůležitější co máš! Bez nich bys těžko udělal třeba jen jednoduchý spojový seznam, a práce s řetězci by byla mnohem komplikovanější. Jeden příklad:
char text[100]; je pole znaků o velikosti 100 bajtů. Můžeš do něj uložit řetězec o maximální délce 99B, protože vždycky musíš mít na konci znak '\0', který ho ukončuje.
Dá se s ním pracovat jako s polem:
text[12]='B'; ti na třináctou pozici (první znak má číslo 0!) vloží velké B.
Ale pokud chceš předat nějaké funkci celý řetězec, předáš na něj jen ukazatel, co je pouze název toho pole bez té bižuterie okolo:
text. Například výpis textu bude takhle:
printf("%s", text);Funkce dostane adresu začátku textu, a vypíše ti na obrazovku všechny znaky od té adresy až k prvnímu nulovému.
To je
nejrychlejší možný způsob jak se to dá udělat, nic efektivnějšího už neexistuje. Ale je to zároveň také velmi nebezpečné, protože pokud nebyl ten řetězec ukončený nulou (znakem s ASCII kódem 0), tak se prostě vypisuje pořád dál, dokud funkce nedojde k nějaké nule, nebo dokud nepřekročí paměť vymezenou pro program, načež ho operační systém odstřelí jako prašivého psa, a po zásluze!
Jenže to máš stále jen řetězec s pevně stanovenou délkou, tak jak jí nastavíš při psaní programu. Ale tímhle způsobem bys třeba textový editor programovat nemohl, protože nevíš předem jak dlouhý text bude. Takže ve skutečnosti to proběhne jinak:
char *text=NULL; vytvoří ukazatel na pole znaků, tedy řetězec, a rovnou ho nastaví na úplný začátek paměti (adresu 0), kde zaručeně žádná data nejsou, To je důležité pro kontrolu jestli ukazatel někam ukazuje nebo ne! Pomocí funkce
malloc() si potom požádáš o potřebnou velikost paměti, operační systém ti jí přidělí, a vrátí ukazatel na dostatečně velký volný úsek, který do té proměnné
text zapíšeš. Potom s ní můžeš pracovat úplně stejně jako s předchozím řetězcem stálé velikosti...
Může ale nastat situace že je paměť plná a operační systém prostě nemá co přidělit, potom ti
malloc() vrátí místo ukazatele právě ten výše zmíněný
NULL, takže je dobré po každé takové činnosti otestovat co jsi vlastně dostal, a podle toho se zařídit. On by totiž jakýkoliv pokus o čtení nebo zápis na adrese 0 skončil opět okamžitým odstřelem tvého programu.
No a když už tu paměť nepotřebuješ, tak jí systému zase vrátíš příkazem
free(text);, a je velmi užitečné ihned po tom do té proměnné zase vložit
NULL, abys případně věděl že nikam neukazuje! Jinak bys při příštím pokusu mohl přepsat data která v tu chvíli patří úplně jiným proměnným, a pokud by ta tvoje bývalá paměť už byla přidělená jinému programu, následovalo by co?
Zase ten odstřel, jako obvykle
To je jen malý zlomek toho co se dá s ukazateli provádět, dají se použít prakticky na cokoliv, a pro práci s nimi je v těch jazycích spousta užitečných pomůcek. Třeba ukazatelové aritmetika, která ti pomáhá počítat další pozici automaticky podle toho kolik bajtů daný typ v paměti zabírá...
Ale naopak ty, pro správné použití ukazatelů, musíš dobře chápat jak je paměť počítače organizovaná a jak s ní procesor pracuje, a musíš dávat velmi dobrý pozor, abys neudělal nějakou chybku, protože ta může mít vražedné následky pro data se kterými pracuješ v úplně jiné části programu.
P.S. Nula je prostě nejdůležitější číslo jaké existuje, a v programování to platí ještě 1024krát víc než v matematice
