reklama

Ať už si to uvědomujete nebo ne, drtivá většina programů, které jste použili, nějakým způsobem využívá ukazatele. Možná jste zažili NullPointerException v určitém okamžiku. Jako programátor kód, který píšete, bude více než pravděpodobně používat ukazatele, i když je sami neimplementujete.

Dnes vám ukážu, jak fungují ukazatele, takže byste se měli podívat jak pole a seznamy fungují Jak pole a seznamy fungují v PythonuPole a seznamy jsou jedny z nejužitečnějších datových struktur v programování - ačkoli je jich jen málo lidí plně využívá. Přečtěte si více pro programovací primer. Tento článek bude více založený na teorii než obvykle, ale držte se ho, ukazatele jsou velmi složité!

Kompilační kód

Než začnete kopat do ukazatelů, musíte pochopit, jak je kód vytvořen a spuštěn - možná to už víte. Tato část bude obsahovat poměrně obecná prohlášení - věci, které se vztahují na internet většina jazyků, ale ne nutně všechny.

Ukazatele

Vezměme si věci zpět na začátek. Každý počítač používá binární Co je binární? [Vysvětlená technologie]

instagram viewer
Vzhledem k tomu, že binární je pro existenci počítačů naprosto zásadní, zdá se zvláštní, že jsme se tímto tématem nikdy nezabývali - takže dnes bych si myslel, že podám stručný přehled toho, co binární ... Přečtěte si více , řada těch a nul, které tvoří moderní technologii tak, jak ji známe. Je velmi obtížné kódovat cokoli v binárním formátu (soubory by byly velmi matoucí), protože se jedná o hrubé pokyny, které potřebuje váš centrální procesorová jednotka nebo CPU funguje Co je CPU a co dělá?Výpočtové zkratky jsou matoucí. Co je vlastně CPU? A potřebuji čtyřjádrový nebo dvoujádrový procesor? A co AMD nebo Intel? Jsme tu, abychom vám pomohli vysvětlit rozdíl! Přečtěte si více . Toto je známé jako Strojový kód.

Další krok od strojového kódu je Shromáždění. Toto je poněkud lidsky čitelný formát. I když je stále složité programovat, je to možné. Sestavení je tvořeno řadou jednoduchých příkazů pro provádění úkolů a je známé jako nízká úroveň programovací jazyk. Je možné psát složité programy, ale je obtížné vyjádřit abstraktní pojmy a vyžaduje hodně zvážení.

Mnoho videoher a vysoce výkonných aplikací obsahuje některé logiky sestavené, protože pokud víte, co děláte, můžete najít určité zvýšení rychlosti. U velké většiny programovacích projektů však nemusíte znát vůbec žádné shromáždění.

Ukazatele

Takže pokud je strojový kód příliš obtížný na psaní a montáž je příliš obtížná na programování, s čím píšete kód? Tady je kde vysoká úroveň jazyky přicházejí. Jazyky na vysoké úrovni usnadňují psaní programů. Můžete programovat v něčem, co se podobá vašemu rodnému jazyku, a je snadné vyjádřit složité algoritmy. Možná už jste slyšeli o mnoha jazycích na vysoké úrovni (a určitě jste použili program v nich napsaný):

  • ZÁKLADNÍ
  • C ++
  • Lisp

Tyto jazyky jsou nyní velmi staré a mnoho z nich bylo vyvinuto na počátku 50. let! Téměř každý moderní programovací jazyk je jazykem vysoké úrovně, včetně PHP a Python. Každý den je vynalezeno více jazyků (ačkoli jich je asi dost), ale jak přesně váš kód stále funguje správně, pokud počítače vyžadují strojový kód?

Zde přichází kompilace. Kompilátor je program, který převádí váš kód vysoké úrovně na formu, kterou lze spustit. Může to být další jazyk na vysoké úrovni, ale obvykle je to shromáždění. Některé jazyky (například Python nebo Java) převádějí váš kód do tzv. Mezistupně bytecode. To bude nutné znovu kompilovat později, což se obvykle provádí na vyžádání, například při spuštění programu. Toto je známé jako právě včas kompilace a je to docela populární.

Správa paměti

Nyní, když víte, jak programovací jazyky fungují, pojďme se podívat na správu paměti v jazycích vysoké úrovně. Pro tyto příklady budu používat pseudo kód - kód, který není napsán v žádném konkrétním jazyce, ale slouží spíše k zobrazení pojmů než přesné syntaxe. Dnes to bude většinou připomínat C ++, protože je to nejlepší jazyk na vysoké úrovni (podle mého názoru).

V této části vám pomůže, pokud máte porozumění jak RAM funguje Rychlý a špinavý průvodce RAM: Co potřebujete vědětRAM je klíčovou součástí každého počítače, ale může být matoucí. Rozdělujeme to podle snadno pochopitelných podmínek, kterým rozumíte. Přečtěte si více .

Většina jazyků má proměnné - kontejnery, které ukládají některá data. Musíte explicitně definovat datový typ. Některé dynamicky psané jazyky, jako jsou Python nebo PHP, to zvládnou za vás, ale stále to musí udělat.

Řekněme, že máte proměnnou:

int myNumber;

Tento kód deklaruje volanou proměnnou moje číslo, a dává mu datový typ celé číslo. Po kompilaci počítač interpretuje tento příkaz jako:

"Najděte nějakou prázdnou paměť a rezervujte dostatek místa pro uložení celého čísla."

Jakmile je tento příkaz proveden, nemůže tento bit použít jiný program. Zatím neobsahuje žádná data, ale je vyhrazena pro vaši proměnnou myNumber.

Nyní přiřaďte vaší proměnné hodnotu:

myNumber = 10;

K dokončení této úlohy přistupuje počítač k vyhrazenému umístění v paměti a mění jakoukoli uloženou hodnotu na tuto novou hodnotu.

Nyní je to vše v pořádku a dobré, ale jak se paměťová místa nezachovávají? Pokud si programy rezervují veškerou paměť, kterou mají rádi, RAM by se okamžitě zaplní - to by znamenalo a velmi pomalý systém.

Ukazatele

Aby se tomuto potenciálnímu problému vyhlo, implementuje mnoho jazyků a Popelář, které se používají ke zničení proměnných (a tedy uvolnění rezervovaných paměťových míst), které již zmizely mimo rozsah.

Možná se ptáte, jaký je rozsah a proč je tak důležitý. Rozsah definuje limity a životnost proměnných nebo jakékoli paměti používané programem. Proměnná je „mimo rozsah“, pokud k ní již nelze přistupovat pomocí žádného kódu (to je v okamžiku, kdy do něj vstoupí sběratel odpadu). Zde je příklad:

function maths () {int firstNumber = 1; } int secondNumber = 2; tisk (firstNumber + secondNumber); // to nebude fungovat

Tento příklad nebude kompilován. Proměnná firstNumber je uvnitř matematika funkce, takže to je rozsah. Nelze se k němu dostat z vnějšku funkce, ve které byl deklarován. Toto je důležitý programovací koncepta pochopení je zásadní pro práci s ukazateli.

Tento způsob zpracování paměti se nazývá zásobník. Je to způsob, jak funguje velká většina programů. Nemusíte rozumět ukazatelům, abyste je mohli používat, a je to docela dobře strukturované. Nevýhodou zásobníku je rychlost. Protože počítač musí přiřadit paměť, sledovat proměnné a spouštět sběr odpadu, existuje malá režie. To je v pořádku pro menší programy, ale co úlohy s vysokým výkonem nebo aplikace náročné na data?

Zadejte: ukazatele.

Ukazatele

Na povrchu zní ukazatele jednoduše. Odkazují (ukázat na) umístění v paměti. To se nemusí zdát jinak než „normální“ proměnné v zásobníku, ale věřte mi, existuje obrovský rozdíl. Ukazatele jsou uloženy na halda. Toto je opak zásobníku - je méně organizovaný, ale je mnohem rychlejší.

Pojďme se podívat na to, jak jsou proměnné přiřazeny k zásobníku:

int numberOne = 1; int numberTwo = numberOne;

Toto je jednoduchá syntaxe; Proměnná číslo dvě obsahuje číslo jedna. Jeho hodnota je kopírována během přiřazení z číslo jedna proměnná.

Pokud jste chtěli získat adresa paměti proměnné, místo její hodnoty, musíte použít znak ampersand (&). Tomu se říká adresa operátor a je nedílnou součástí vaší sady nástrojů pro ukazatele.

int numberOne = 1; int numberTwo = & numberOne;

Teď číslo dvě proměnná body na místo v paměti, místo aby se číslo jedna zkopírovalo na vlastní, nové místo v paměti. Kdybyste měli tuto proměnnou vydat, nebyla by to číslo jedna (i když je to uloženo v paměti). Výsledkem by bylo umístění paměti (pravděpodobně něco jako 2167, i když se liší v závislosti na systému a dostupné paměti RAM). Chcete-li získat přístup k hodnotě uložené v ukazateli, musíte místo umístění v paměti provést dereference ukazatel. Toto přistupuje přímo k hodnotě, což by v tomto případě bylo číslo jedna. Zde je návod, jak dereference ukazatel:

int numberTwo = * numberOne;

operátor dereference je hvězdička (*).

To může být obtížné pochopit, pojďme se tedy na to znovu:

  • adresa operátor (&) uloží adresu paměti.
  • operátor dereference (*) přistupuje k hodnotě.

Při deklaraci ukazatelů se syntaxe mírně mění:

int * myPointer;

Datový typ int zde se odkazuje na datový typ ukazatele body na a ne na typ samotného ukazatele.

Nyní, když víte, jaké jsou ukazatele, můžete s nimi udělat opravdu pěkné triky! Při použití paměti se spustí váš operační systém postupně. RAM můžete považovat za holubí díry. Mnoho otvorů pro uložení něčeho, najednou lze použít pouze jednu. Rozdíl je v tom, že tyto holubí díry jsou očíslovány. Při přiřazování paměti se váš operační systém spustí od nejnižšího čísla a pracuje. Nikdy se nebude pohybovat mezi náhodnými čísly.

Ukazatele

Při práci s ukazateli, pokud jste přiřadili pole, můžete snadno přejít na další prvek jednoduchým zvýšením ukazatele.

Tady je to zajímavé. Když předáte hodnoty funkci (pomocí proměnných uložených v zásobníku), tyto hodnoty se zkopírují do vaší funkce. Pokud se jedná o velké proměnné, program je nyní ukládá dvakrát. Po dokončení funkce budete možná potřebovat způsob, jak tyto hodnoty vrátit. Funkce mohou obecně vrátit pouze jednu věc - tak co kdybyste chtěli vrátit dvě, tři nebo čtyři věci?

Ukazatele

Pokud funkci předáte ukazatel, zkopíruje se pouze adresa paměti (což je nepatrné). To šetří váš procesor hodně práce! Možná ukazatel ukazuje na obrovské obrazové pole - nejenže vaše funkce může fungovat přesně stejně data uložená na stejném místě v paměti, ale jakmile je hotovo, není třeba se vracet cokoliv. Elegantní!

Musíte však být velmi opatrní. Ukazatele mohou stále přesahovat rozsah a mohou být shromažďovány sběratelem odpadu. Hodnoty uložené v paměti se však neshromažďují. Tomu se říká nevracení paměti. K datům již nemůžete přistupovat (protože ukazatele byly zničeny), stále však využívá paměť. To je častý důvod pro selhání mnoha programů a pokud existuje velké množství dat, může to působivě selhat. Váš operační systém většinou zabije váš program, pokud máte velký únik (využívající více paměti RAM, než má systém), ale to není žádoucí.

Ukazatele

Ladicí ukazatele mohou být noční můrou, zejména pokud pracujete s velkým množstvím dat nebo pracujete ve smyčkách. Jejich nevýhody a potíže s porozuměním skutečně stojí za kompromisy, které získáte při výkonu. Ačkoli si pamatujete, nemusí být vždy vyžadovány.

To je pro dnešek. Doufám, že jste se dozvěděli něco užitečného o složitém tématu. Samozřejmě jsme nepokryli vše, co je třeba vědět - je to velmi složité téma. Pokud máte zájem dozvědět se více, vřele doporučuji C ++ za 24 hodin.

Pokud to bylo trochu složité, podívejte se na náš průvodce nejjednoduššími programovacími jazyky 6 nejjednodušších programovacích jazyků pro začátečníkyNaučit se programovat je o nalezení správného jazyka stejně jako o procesu editace. Zde je prvních šest nejjednodušších programovacích jazyků pro začátečníky. Přečtěte si více .

Naučili jste se dnes, jak fungují ukazatele? Máte nějaké tipy a triky, které chcete sdílet s ostatními programátory? Přejít na komentáře a podělte se o své myšlenky níže!

Joe je absolventem informatiky na University of Lincoln ve Velké Británii. Je to profesionální softwarový vývojář, a když nelétá dronů nebo píše hudbu, často ho najde, když fotografuje nebo produkuje videa.