====== Pointer (Ukazatel) ====== **Pointer** je základní stavební kámen nízkoúrovňového programování. Umožňuje programátorovi přímo manipulovat s operační pamětí ([[ram|RAM]]). Místo toho, aby se s daty pracovalo jako s kopiemi, pointer ukazuje přímo na místo, kde data fyzicky leží. Představte si to jako rozdíl mezi tím, když někomu dáte **kopii dokumentu** (hodnota), nebo mu dáte **klíč od skříňky**, ve které je dokument uložen (pointer). ---- ====== Jak pointer funguje v paměti? ====== Každá proměnná v počítači má svou adresu (podobně jako číslo popisné u domu). Pointer tyto adresy ukládá. * **Operátor & (Adresní):** Získá adresu proměnné. * **Operátor * (Dereferenční):** Přistoupí k hodnotě na adrese, na kterou pointer ukazuje. ---- ====== Proč se pointery používají? ====== Použití ukazatelů má několik kritických výhod: ===== 1. Efektivita (Předávání odkazem) ===== Pokud máte v programu obrovský objekt (např. 3D model s miliony bodů), je velmi pomalé jej kopírovat při každém předání funkci. Místo toho předáte jen malý pointer (adresu), což je okamžité. ===== 2. Dynamická správa paměti ===== Pointery umožňují alokovat paměť až za běhu programu. Můžete tak vytvořit pole prvků, jehož velikost neznáte v době psaní kódu, ale zjistíte ji až podle potřeby uživatele. ===== 3. Práce s hardwarem ===== Při psaní ovladačů (driverů) nebo operačních systémů musí programátor přistupovat k přesným adresám v paměti, které ovládají hardware (např. grafickou kartu). ---- ====== Rizika a "nebezpečné" pointery ====== Manuální správa paměti pomocí pointerů je častým zdrojem chyb: * **Memory Leak (Únik paměti):** Program si vyžádá paměť přes pointer, ale zapomene ji vrátit. Paměť zůstane blokovaná, dokud program nespadne nebo není ukončen. * **Dangling Pointer (Visící ukazatel):** Pointer ukazuje na místo, které už bylo smazáno. Přístup k němu způsobí pád programu (Segmentation Fault). * **Null Pointer:** Ukazatel, který nikam neukazuje. Pokus o jeho "přečtení" je nejčastější příčinou pádu aplikací. ---- ====== Srovnání: Pointer vs. Reference ====== V moderním [[c++|C++]] se často místo syrových pointerů používají reference nebo "chytré ukazatele" (smart pointers). ^ Vlastnost ^ Pointer ^ Reference ^ | **Může být prázdný?** | Ano (NULL/nullptr). | Ne, musí být inicializována. | | **Změna cíle?** | Ano, může ukázat na jinou adresu. | Ne, je to jen "přezdívka" pro jednu věc. | | **Syntaxe** | Složitější (vyžaduje * a ->). | Jednoduchá (jako běžná proměnná). | ---- //Související pojmy: C++, RAM, Kompilátor, Strojový kód, Dynamická alokace.//