Úvod do ukazatelů pro programátory

  • William Charles
  • 0
  • 2032
  • 393
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 si můžete prohlédnout, jak fungují pole a seznamy Jak fungují pole a seznamy v Pythonu Jak fungují pole a seznamy v Pythonu Pole a seznamy jsou některé z nejužitečnějších datových struktur v programování - - i když je jich jen málo využívá k plnému využití. pro programovací primer. Tento článek bude založen více na teorii než obvykle, ale držet 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.

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] Co je binární? [Technologie vysvětlena] Vzhledem k tomu, že binární je tak absolutně zásadní pro existenci počítačů, zdá se divné, že jsme se s tématem nikdy nezabývali - takže dnes bych si myslel, že dám krátký přehled toho, co binární…, ř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, aby fungoval Co je CPU a co dělá? 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! . 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 složeno z řady 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í koncepty a vyžaduje hodně pozornosti.

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. Pro většinu programovacích projektů však nemusíte znát vůbec žádné shromáždění.

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 provést. Může to být další jazyk na vysoké úrovni, ale obvykle se jedná o sestavení. 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 pseudokód - kód psaný nikoli v žádném konkrétním jazyce, ale používaný k zobrazení konceptů spíše než přesné syntaxe. Dnes to bude většinou připomínat C ++, protože to je nejlepší jazyk na vysoké úrovni (podle mého názoru).

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

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 je 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 velmi pomalý systém.

Aby se tomuto potenciálnímu problému zabránilo, mnoho jazyků implementuje Popelář, Používá se ke zničení proměnných (a proto uvolnění rezervovaných paměťových míst), které odešly 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” když k němu již nebude přístupný žádný kód (v tom případě 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í koncept, a porozumění 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ým pracuje 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írku odpadků, 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 “pravidelný” proměnné v zásobníku, ale věřte mi, je tu 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á syntax; 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 dostat adresa paměti proměnné, namí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 do vlastního, nového umístění v paměti. Pokud byste měli výstup této proměnné, nebylo 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í 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ě změ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 se. Nikdy se nebude pohybovat mezi náhodnými čísly.

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?

Pokud do funkce předáte ukazatel, zkopíruje se pouze adresa paměti (což je nepatrné). To šetří váš procesor hodně práce! Možná váš ukazatel ukazuje na obrovské obrazové pole - nejenže vaše funkce může pracovat na přesně stejných datech uložených ve stejném umístění v paměti, ale jakmile je hotovo, není třeba nic vrátit. 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í.

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 ++ do 24 hodin.

Pokud to bylo trochu složité, podívejte se na našeho průvodce nejjednoduššími programovacími jazyky. 6 Nejjednodušší programovací jazyky se naučit pro začátečníky 6 Nejjednodušší programovací jazyky se naučit pro začátečníky Naučit se programovat je o nalezení správného jazyka stejně jako o proces editace. Zde je prvních šest nejjednodušších programovacích jazyků pro začátečníky. .

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ělit se o své myšlenky níže!




Bisher hat noch niemand einen Kommentar zu diesem Artikel abgegeben.

O moderní technologii, jednoduché a cenově dostupné.
Váš průvodce ve světě moderních technologií. Naučte se, jak používat technologie a pomůcky, které nás každý den obklopují, a naučte se, jak objevovat na internetu zajímavé věci.