Reklama

Či už si to uvedomujete alebo nie, veľká väčšina programov, ktoré ste použili, nejakým spôsobom využíva ukazovatele. Možno ste zažili a NullPointerException v určitom okamihu. Ako programátor bude písaný kód používať ukazovatele viac ako pravdepodobné, aj keď ste ich sami nevykonali.

Dnes vám ukážem, ako fungujú ukazovatele, takže by ste sa mali pozrieť ako fungujú polia a zoznamy Ako fungujú polia a zoznamy v PythonePolia a zoznamy sú jedny z najužitočnejších štruktúr údajov v programovaní - hoci ich málokto využíva ich plný potenciál. Čítaj viac pre programovací primer. Tento článok bude založený viac na teórii ako obvykle, ale držte sa ho, ukazovatele sú veľmi zložité!

Zostavovací kód

Pred vykopávaním do ukazovateľov musíte pochopiť, ako sa kód zostavuje a spúšťa - možno to už viete. Táto časť bude obsahovať pomerne všeobecné vyhlásenia - veci, ktoré sa vzťahujú na internet väčšina jazykov, ale nie nevyhnutne všetkých.

ukazovátka

Vezmime si veci späť na začiatok. Každý počítač používa binárne

instagram viewer
Čo je binárne? [Vysvetlenie technológie]Vzhľadom na to, že binárne údaje sú pre existenciu počítačov absolútne nevyhnutné, zdá sa byť čudné, že sme sa touto témou nikdy nezaoberali - takže dnes by som si myslel, že poskytnem stručný prehľad toho, čo je binárne ... Čítaj viac , séria núl a núl, ktoré tvoria moderné technológie tak, ako ich poznáme. Je veľmi ťažké kódovať čokoľvek v binárnom formáte (súbory by boli veľmi mätúce), pretože ide o prvotné pokyny, ktoré potrebuje váš centrálna procesorová jednotka alebo CPU funguje Čo je to procesor a čo to robí?Výpočtové skratky sú mätúce. Čo je vlastne CPU? A potrebujem štvorjadrový alebo dvojjadrový procesor? A čo AMD alebo Intel? Sme tu, aby sme vysvetlili rozdiel! Čítaj viac . Toto je známe ako Strojový kód.

Ďalší krok od strojového kódu je zhromaždenie. Toto je trochu ľudsky čitateľný formát. Aj keď je stále zložité programovať, je to možné. Zostavenie sa skladá z niekoľkých jednoduchých príkazov na vykonávanie úloh a je známe ako nízky level programovací jazyk. Je možné písať zložité programy, ale je ťažké vyjadriť abstraktné koncepty a vyžaduje si to veľkú pozornosť.

Mnoho videohier a vysokovýkonných aplikácií má zostavenú logiku, pretože ak viete, čo robíte, môžete nájsť určité zvýšenie rýchlosti. Pre veľkú väčšinu programovacích projektov však nemusíte poznať žiadne zhromaždenie.

ukazovátka

Takže ak je strojový kód príliš ťažko písateľný a montáž je príliš náročná na programovanie, s čím píšete kód? Tu je kde vysoký stupeň jazyky prichádzajú. Jazyky vysokej úrovne uľahčujú písanie programov. Môžete naprogramovať niečo, čo sa podobá vášmu rodnému jazyku, a je ľahké vyjadriť zložité algoritmy. Možno ste už počuli o mnohých jazykoch na vysokej úrovni (a určite ste použili program, ktorý je v nich napísaný):

  • BASIC
  • C ++
  • šišlavost

Tieto jazyky sú už veľmi staré a mnohé boli vyvinuté začiatkom 50. rokov 20. storočia! Takmer každý moderný programovací jazyk je jazykom vysokej úrovne vrátane PHP a Python. Každý deň sa vyvíja viac jazykov (aj keď je ich pravdepodobne už dosť), ale ako presne váš kód stále funguje správne, ak počítače vyžadujú strojový kód?

Tu je kompilácia. Kompilátor je program, ktorý prevádza váš kód vysokej úrovne na formu, ktorú je možné vykonať. Môže to byť ďalší jazyk na vysokej úrovni, zvyčajne sa však jedná o zostavenie. Niektoré jazyky (napríklad Python alebo Java) prevádzajú váš kód do tzv. Medzistupne bytecode. Toto bude potrebné znova zostaviť neskôr, čo sa zvyčajne robí na požiadanie, napríklad pri spustení programu. Toto je známe ako práve včas kompilácie a je to celkom populárne.

Správa pamäte

Teraz, keď viete, ako programovacie jazyky fungujú, pozrime sa na správu pamäte v jazykoch vysokej úrovne. Pre tieto príklady budem používať pseudokód - kód napísaný nie v žiadnom konkrétnom jazyku, ale používa sa na zobrazenie pojmov a nie na presnú syntax. Dnes sa to bude najviac podobať jazyku C ++, pretože je to najlepší jazyk na vysokej úrovni (podľa môjho názoru).

V tejto časti vám pomôže, ak máte pochopenie ako funguje RAM Stručný a špinavý sprievodca po RAM: Čo potrebujete vedieťRAM je kľúčovou súčasťou každého počítača, ale môže byť mätúci. Rozkladáme to tak, aby ste ich ľahko pochopili. Čítaj viac .

Väčšina jazykov má premenné - kontajnery, ktoré ukladajú niektoré údaje. Musíte explicitne definovať dátový typ. Niektoré dynamicky napísané jazyky, ako napríklad Python alebo PHP, to zvládnu za vás, ale stále to musia urobiť.

Povedzme, že máte premennú:

int myNumber;

Tento kód deklaruje volanú premennú moje číslo, a dáva jej dátový typ celé číslo. Po kompilácii počítač interpretuje tento príkaz ako:

„Nájdite prázdnu pamäť a vyhradte si dostatočne veľký priestor na uloženie celého čísla“

Po vykonaní tohto príkazu tento bit nemôže použiť iný program. Zatiaľ neobsahuje žiadne údaje, ale je vyhradený pre vašu premennú myNumber.

Teraz svojej premennej priraďte hodnotu:

myNumber = 10;

Ak chcete dokončiť túto úlohu, počítač pristupuje k rezervovanému miestu v pamäti a zmení bez ohľadu na to, čo je v nej uložené, na túto novú hodnotu.

Teraz je to všetko v poriadku a dobré, ale ako sa nezachovajú miesta v pamäti? Keby programy rezervovali všetku pamäť, ktorú majú radi, RAM by sa okamžite zaplnila - to by znamenalo a veľmi pomalý systém.

ukazovátka

Aby sa tomuto možnému problému zabránilo, mnoho jazykov implementuje a smetiar, ktoré sa používajú na zničenie premenných (a teda uvoľnenie rezervovaných umiestnení pamäte), ktoré už prešli mimo rozsah.

Možno sa pýtate, aký rozsah je a prečo je taký dôležitý. Rozsah definuje limity a životnosť premenných alebo pamäte používanej programom. Premenná je „mimo rozsahu“, keď k nemu už nie je možné pristupovať pomocou žiadneho kódu (vtedy, keď do nej vstúpi zberateľ odpadu). Tu je príklad:

matematické funkcie () {int firstNumber = 1; } int secondNumber = 2; tlač (prvé číslo + druhé číslo); // nebudem pracovať

Tento príklad sa nebude kompilovať. Premenná firstNumber je v rámci matematika funkcie, takže to je rozsah. Nie je prístupný mimo funkcie, v ktorej bol vyhlásený. Toto je dôležitá koncepcia programovaniaa pochopenie, že je nevyhnutné pracovať s ukazovateľmi.

Tento spôsob manipulácie s pamäťou sa nazýva stoh. Takto funguje prevažná väčšina programov. Nemusíte rozumieť ukazovateľom, aby ste ho mohli používať, a je celkom dobre štruktúrovaný. Nevýhodou stohu je rýchlosť. Pretože počítač musí priradiť pamäť, sledovať premenné a spustiť kolekciu odpadkov, existuje malá réžia. To je v poriadku pre menšie programy, ale čo úlohy s vysokým výkonom alebo aplikácie náročné na dáta?

Zadajte: ukazovatele.

ukazovátka

Ukazovatele na povrchu znejú jednoducho. Odkazujú (ukázať na) miesto v pamäti. To sa nemusí zdať odlišné od „bežných“ premenných v zásobníku, ale verte mi, existuje obrovský rozdiel. Ukazovatele sú uložené na webe halda. Toto je opak zásobníka - je menej organizovaný, ale je oveľa rýchlejší.

Pozrime sa, ako sú v zásobníku priradené premenné:

int numberOne = 1; int numberTwo = numberOne;

Toto je jednoduchá syntax; Premenná číslo dva obsahuje číslo jedna. Jeho hodnota sa kopíruje počas priradenia z číslo jeden variabilné.

Ak ste chceli získať adresa pamäte premennej namiesto jej hodnoty musíte použiť znak ampersand (&). Toto sa nazýva adresa operátor a je nevyhnutnou súčasťou vašej súpravy nástrojov ukazovateľov.

int numberOne = 1; int numberTwo = & numberOne;

Teraz číslo dva premenlivý body na miesto v pamäti, namiesto toho, aby sa číslo jedna skopírovalo na svoje vlastné nové miesto v pamäti. Keby ste mali vypísať túto premennú, nebolo by to číslo jedna (aj keď je uložené v pamäti). Výstupom by bolo umiestnenie pamäte (pravdepodobne niečo ako 2167, hoci sa líši v závislosti od systému a dostupnej pamäte RAM). Ak chcete získať prístup k hodnote uloženej v ukazovateli, musíte namiesto umiestnenia v pamäti vykonať dereferencia ukazovateľ. Tým sa získa priamy prístup k hodnote, ktorá by v tomto prípade bola číslo jedna. Takto dereferencia ukazovateľa:

int numberTwo = * numberOne;

operátor dereference je hviezdička (*).

To môže byť ťažké pochopiť, preto si poďme na to znova:

  • adresa operátor (&) uloží adresu pamäte.
  • operátor dereference (*) získava prístup k hodnote.

Pri deklarovaní ukazovateľov sa syntax mierne zmení:

int * myPointer;

Údajový typ int tu sa odkazuje na dátový typ ukazovateľa body na, a nie na samotný typ ukazovateľa.

Teraz, keď viete, aké sú ukazovatele, môžete s nimi urobiť skutočne pekné triky! Ak sa používa pamäť, váš operačný systém sa spustí sekvenčne. RAM môžete považovať za holubie diery. Veľa dier na uloženie niečoho, naraz sa dá použiť iba jedna. Rozdiel je v tom, že všetky tieto holuby sú očíslované. Pri prideľovaní pamäte sa váš operačný systém spustí pri najnižšom počte a pracuje sa. Nikdy nebude preskakovať medzi náhodnými číslami.

ukazovátka

Ak ste pri práci s ukazovateľmi priradili pole, môžete ľahko prejsť na ďalší prvok jednoduchým zvýšením ukazovateľa.

Tu je to zaujímavé. Keď hodnoty odovzdáte funkcii (pomocou premenných uložených v zásobníku), tieto hodnoty sa skopírujú do vašej funkcie. Ak sú to veľké premenné, program ich teraz ukladá dvakrát. Po dokončení vašej funkcie budete možno potrebovať spôsob, ako tieto hodnoty vrátiť. Funkcie môžu vo všeobecnosti vrátiť iba jednu vec - tak čo keby ste chceli vrátiť dve, tri alebo štyri veci?

ukazovátka

Ak do svojej funkcie odovzdáte ukazovateľ, skopíruje sa iba adresa pamäte (čo je nepatrné). To šetrí váš procesor veľa práce! Možno, že váš ukazovateľ ukazuje na obrovské obrazové pole - vaša funkcia môže fungovať nielen úplne presne údaje uložené na rovnakom mieste v pamäti, ale po dokončení sa už nemusíte vracať čokoľvek. Neat!

Musíte však byť veľmi opatrní. Ukazovatele môžu zostať mimo rozsahu pôsobnosti a môžu byť zbierané zberateľom odpadu. Hodnoty uložené v pamäti sa však nezhromažďujú. Toto sa nazýva únik pamäte. K údajom už nemôžete pristupovať (pretože ukazovatele boli zničené), stále však využíva pamäť. To je častý dôvod, pre ktorý sa mnohé programy zrútili, a ak existuje veľké množstvo údajov, môže to zlyhať. Váš operačný systém väčšinou zabije váš program, ak dôjde k veľkému úniku údajov (pri použití viac pamäte RAM ako má systém), ale to nie je žiaduce.

ukazovátka

Ladiace ukazovatele môžu byť nočnou morou, najmä ak pracujete s veľkým množstvom údajov alebo pracujete v slučkách. Ich nevýhody a ťažkosti s porozumením skutočne stoja za kompromisy, ktoré získate pri výkone. Aj keď si pamätajte, nemusia sa vždy vyžadovať.

To je dnes. Dúfam, že ste sa naučili niečo užitočné o zložitej téme. Samozrejme sme sa nezaoberali všetkým, čo je potrebné vedieť - je to veľmi zložitá téma. Ak máte záujem dozvedieť sa viac, dôrazne odporúčam C ++ do 24 hodín.

Ak to bolo trochu zložité, pozrite sa na náš sprievodca najjednoduchšími programovacími jazykmi 6 najjednoduchších programovacích jazykov, ktoré sa majú učiť začiatočníciNaučiť sa programovať je o hľadaní správneho jazyka rovnako ako o procese editácie. Tu je šesť najjednoduchších programovacích jazykov pre začiatočníkov. Čítaj viac .

Naučili ste sa, ako ukazovatele dnes fungujú? Máte nejaké tipy a triky, ktoré chcete zdieľať s ostatnými programátormi? Preskočte do komentárov a podeľte sa o svoje myšlienky nižšie!

Joe je absolventom informatiky na University of Lincoln vo Veľkej Británii. Je to profesionálny vývojár softvéru a keď nelieta bezpilotných lietadiel alebo píše hudbu, často ho nájdu pri fotografovaní alebo výrobe videa.