Hledejte v chronologicky řazené databázi studijních materiálů (starší / novější příspěvky).

12. Základní typy dat, celočíselné typy, znakové typy, racionální typy, prázdný typ.

Všechno viz otázka 2

Prázdný typ void:
Používá se u funkcí, pokud nepotřebujeme, aby funkce vracela nějakou hodnotu. Pokud funkci napíšeme bez návratového typu, překladač si za návratový typ implicitně(automaticky) doplní typ void.
Další využití typu void je u ukazatelů(viz otázka č. 14 až na konci).


12. Odvozené typy: ukazatele a pole.

Ukazatele a pole:
Pozn.: Myslím, že aritmetické operace patří spíš do této otázky.
V jazyce C++ existuje úzká souvislost mezi datovým typem pole a typem ukazatel. Díky ní se můžeme na výraz typu pole dívat jako na ukazatel, a také s ním podle toho pracovat.
Aritmetické operace s ukazateli:
Součet ukazatele a celého čísla
Řekněme, že máme ukazatel bázového typu int ukazující někam do paměti. Pokud k tomuto ukazateli přičteme nějaké celé číslo n, vyhodnocením tohoto výrazu bude adresa paměti o n intových hodnot dál, než kam ukazoval původní pointer.

Příklad
short int a[4]={15,134,29,104}; //Definování s inicializací pole
short int *p;

p=&a[0]; /*ukazatel p bude odkazovat na začátek pole. Zápis lze zkrátit na p = a, protože a je vlastně taky ukazatel.*/

Následující tabulka ukazuje, kam se vlastně s pointrem p dostáváme, přičítáme-li k němu postupně čísla 1, 2 a 3.
Bajt 0 Bajt 1 / Bajt 2 Bajt 3 / Bajt 4 Bajt 5 / Bajt 6 Bajt 7
a[0]-----------a[1]-----------a[2]---------a[3]
*p-------------*(p+1)--------*(p+2)------*(p+3)
15--------------134------------29----------104

Druhý řádek tabulky ukazuje klasický způsob, jak se dostat k jednotlivým prvkům pole – indexaci. Třetí řádek představuje ekvivalentní zápis pomocí dereferovaného ukazatele. Jak vidíte, přičtení čísla k pointeru neznamená jeho posunutí o jeden byte, ale o celou velikost jeho bázového typu. V případě námi použitého typu short int to jsou dva byty. Přičtu-li tedy k našemu pointeru p číslo jedna, výsledkem operace bude pointer ukazující v paměti o dva byty, neboli o jeden short int, dál. Prakticky tedy takto získaný pointer bude ukazovat na druhý prvek pole a. Dereferencí pak tento prvek získáme stejně, jako kdybychom použili indexaci a[1].
Inkrementujeme-li ukazatel, jednoduše měníme místo, kam ukazuje, a to stejně, jako kdybychom k ukazateli přičetli číslo 1.

Odečtení celého čísla od ukazatele
Situace s odčítáním ukazatele a celého čísla je analogická operaci sčítání, jenom se posunujeme v paměti opačným směrem. Měli bychom si ale být jisti, že paměť, ke které takto přistoupíme, nám skutečně patří. To ale platí pro jakoukoliv práci s pointery a vlastně i s poli.
Stejně jako můžeme na ukazatel aplikovat operátor inkrementace, můžeme použít i operátor dekrementace.

Rozdíl dvou ukazatelů
V jazyce C++ je definován i rozdíl dvou ukazatelů stejného bázového typu. Tato operace má smysl hlavně v případě, že oba pointery ukazují do stejného pole. Pak je výsledkem takové operace celočíselná hodnota, která představuje vzdálenost mezi prvky pole, na které pointery ukazují. Tato vzdálenost je měřena v počtu prvků pole.

Zaměnitelnost ukazatele a pole
Aritmetické operace s ukazateli nalézají asi největší uplatnění při práci s poli. Na pole se totiž můžeme dívat jako na pointer ukazující na první prvek tohoto pole. Proto můžeme všechny operace, které jsme prováděli s pointery, dělat i s poli. Můžeme například dereferovat proměnnou typu pole, čímž získáme první prvek tohoto pole(viz předchozí příklad).
Pole ale nelze považovat přímo za ukazatel. Bez problémů funguje přiřazení p=a, ale zápis a=p není možný. Stejný problém by nastal také při použití některého z operátorů inkrementace či dekrementace na proměnnou typu pole.

Žádné komentáře:

Okomentovat