Oglas
Ne glede na to, ali se zavedate ali ne, velika večina programov, ki ste jih uporabili, na nek način uporabi kazalce. Mogoče ste doživeli a NullPointerException na neki točki. Kot programer bo koda, ki jo napišete, več kot verjetno uporabila kazalce, tudi če jih sami niste implementirali.
Danes vam bom pokazal, kako delujejo kazalci, tako da boste morda želeli preveriti kako delujejo matriki in seznami Kako delujejo matriki in seznami v PythonuNiz in seznami so nekaj najbolj uporabnih struktur podatkov pri programiranju - čeprav jih malo ljudi uporablja v celoti. Preberi več za programski primer. Ta članek bo bolj teoretičen kot običajno, vendar se držite tega, kazalci so zelo zapleteni!
Koda za zbiranje
Preden se vkopljete v kazalce, morate razumeti, kako je koda zgrajena in izvedena - morda to že veste. V tem razdelku bodo dokaj splošne izjave - zadeve, ki veljajo za večina jezikov, vendar ne nujno vseh.

Vrnimo stvari na začetek. Vsak računalnik uporablja binarno Kaj je dvojiško? [Pojasnjena tehnologija] Glede na to, da je binarnost tako bistvenega pomena za obstoj računalnikov, se zdi čudno, da se še nikoli nismo lotili teme - zato bi danes mislil, da bom dal kratek pregled kaj binarni ... Preberi več , niz tistih in ničel, ki sestavljajo sodobno tehnologijo, kakršno poznamo. Izjemno težko je kodirati karkoli v binarnem formatu (datoteke bi bile zelo zmedene), saj so to neobdelana navodila, ki jih potrebuje vaš centralna procesna enota ali CPU za delovanje Kaj je CPU in kaj počne?Računalniške kratice so zmede. Kaj sploh je CPU? In ali potrebujem štiri- ali dvojedrni procesor? Kaj pa AMD ali Intel? Tu smo, da vam pomagamo razložiti razliko! Preberi več . To je znano kot Strojna koda.
Naslednji korak od strojne kode je Montaža. To je človeško berljiv format. Čeprav je programiranje še vedno zapleteno, je to mogoče. Sestavljanje je sestavljeno iz niza preprostih ukazov za izvajanje nalog in je znano kot nizka stopnja programski jezik. Mogoče je pisati zapletene programe, vendar je težko izraziti abstraktne pojme in je potrebno veliko premisliti.
V mnogih video igrah in aplikacijah z visoko zmogljivostjo je nekaj logike zapisanih v montaži, saj je mogoče najti nekaj resničnih hitrosti, če veste, kaj počnete. Vendar pa za veliko večino programskih programov sploh ni treba poznati nobenega sklopa.

Torej, če je strojna koda pretežka za pisanje in sestavljanje preveč težko programira, s čim pišete kodo? Tukaj je kje visoka stopnja prihajajo jeziki. Jeziki na visoki ravni olajšajo pisanje programov. Programirate lahko v nečem, kar spominja na vaš materni jezik, in enostavno je izraziti zapletene algoritme. Morda ste že slišali za številne jezike na visoki ravni (in zagotovo boste uporabili program, napisan v njih):
- OSNOVNI
- C ++
- Lisp
Ti jeziki so zdaj že zelo stari in mnogi so bili razviti v zgodnjih petdesetih letih! Skoraj vsak sodoben programski jezik je jezik na visoki ravni, vključno s PHP in Python. Vsak dan se izmišlja več jezikov (čeprav jih je zdaj verjetno dovolj), ampak kako natančno vaša koda še vedno deluje pravilno, če računalniki zahtevajo strojno kodo?
Tukaj je, kje pride kompilacija. Prevajalnik je program, ki pretvori vašo kodo na visoki ravni v obliko, ki jo je mogoče izvršiti. To bi lahko bil še en jezik na visoki ravni, vendar je to običajno sestavljanje. Nekateri jeziki (na primer Python ali Java) pretvorijo kodo v vmesno fazo, imenovano bajt kodo. To bo potrebno ponovno sestaviti pozneje, kar se običajno opravi na zahtevo, na primer, ko se program izvaja. To je znano kot ravno pravi čas kompilacije in je zelo priljubljena.
Upravljanje spomina
Zdaj, ko veste, kako delujejo programski jeziki, poglejmo upravljanje pomnilnika v jezikih visoke ravni. Za te primere bom uporabil psevdo kodo - koda, napisana ne v nobenem določenem jeziku, ampak se uporablja za prikaz konceptov in ne natančne skladnje. Danes bo to večinoma spominjalo na C ++ kot najboljši jezik na visoki ravni (po mojem mnenju).
V tem razdelku bo pomagal, če se boste razumeli kako deluje RAM Hiter in umazan vodnik za RAM: Kaj morate vedetiRAM je ključna sestavina vsakega računalnika, vendar je lahko zmeden. Razčlenimo jo na preprost način, ki ga boste razumeli. Preberi več .
Večina jezikov ima spremenljivke - vsebnike, v katerih so shranjeni nekateri podatki. Izrecno morate določiti vrsto podatkov. Nekateri dinamično tipkani jeziki, kot sta Python ali PHP, to obravnavajo za vas, vendar to še vedno morajo storiti.
Recite, da imate spremenljivko:
int myNumber;
Ta koda razglasi spremenljivko imenovano moja številka, in mu daje podatkovno vrsto celo število. Ko je računalnik sestavljen, ta ukaz razlaga kot:
»Poiščite nekaj praznega pomnilnika in rezervirajte dovolj velik prostor za shranjevanje celega števila«
Ko je ta ukaz izveden, drugega kosa pomnilnika ne more uporabiti drug program. Še ne vsebuje podatkov, je pa rezerviran za spremenljivko myNumber.
Zdaj dodelite vrednost spremenljivki:
myNumber = 10;
Če želite dokončati to nalogo, računalnik dostopa do rezerviranega pomnilnika in spremeni novo vrednost, ki je tam shranjena.
Zdaj je to vse dobro in dobro, toda kako se spominske lokacije nerezervirajo? Če bi programi rezervirali ves spomin, ki jim je všeč, bi se RAM takoj napolnil - to bi pomenilo a zelo počasen sistem.

Da bi se izognili tej potencialni težavi, mnogi jeziki uporabljajo a zbiralec smeti, ki se uporablja za uničenje spremenljivk (in zato sprostitev rezerviranih pomnilniških mest), ki so odšle izven obsega.
Morda se sprašujete, kaj je področje uporabe in zakaj je tako pomembno. Obseg določa meje in življenjsko dobo spremenljivk ali pomnilnika, ki ga uporablja program. Spremenljivka je "zunaj obsega", kadar do nje ni več dostopna nobena koda (to je takrat, ko vstopi smeti). Tu je primer:
funkcija maths () {int firstNumber = 1; } int secondNumber = 2; tisk (firstNumber + secondNumber); // ne bo delovala
Ta primer se ne bo sestavil. Spremenljivka prvoNštevilčno je znotraj matematike funkcijo, tako da je to področje. Do njega ni mogoče dostopati zunaj funkcije, v kateri je bila prijavljena. To je pomemben programski konceptin razumevanje je ključnega pomena za delo s kazalci.
Ta način ravnanja s spominom se imenuje zložiti. Ogromna večina programov deluje tako. Za uporabo tega ni treba razumeti kazalcev in je dokaj dobro strukturiran. Pomanjkljivost skladovnice je hitrost. Ker mora računalnik dodeliti pomnilnik, slediti spremenljivkam in zagnati smeti, je majhen režijski strošek. To je v redu za manjše programe, kaj pa naloge z visoko zmogljivostjo ali podatkovno težke aplikacije?
Vnesite: kazalci.
Kazalci
Na površini kazalci zvenijo preprosto. Sklicujejo se (opozoriti na) mesto v pomnilniku. To se "navadnim" spremenljivkam na nizu morda ne zdi nič drugače, ampak verjemite mi, obstaja velika razlika. Kazalci so shranjeni na kup. To je nasprotje sklada - manj je organizirano, vendar je veliko hitrejše.
Poglejmo si, kako so spremenljivke dodeljene v sveženju:
int numberOne = 1; int številoTwo = številoOne;
To je preprosta skladnja; Spremenljivka številka dve vsebuje številko ena. Vrednost je prepisana med dodelitvijo iz številka ena spremenljivka.
Če bi hotel dobiti spominski naslov spremenljivke, namesto njene vrednosti morate uporabiti znak ampersand (&). Temu se reče naslov operaterja in je bistven del vašega orodjarnega kazalca.
int numberOne = 1; int numberTwo = & numberOne;
Zdaj pa številka dve spremenljivka točk na pomnilniško lokacijo, namesto da bi prvo številko prepisali na svojo novo pomnilniško lokacijo. Če bi oddali to spremenljivko, ne bi bila številka ena (čeprav je shranjena na pomnilniškem mestu). Izdal bo pomnilniško lokacijo (verjetno približno 2167, čeprav se razlikuje glede na sistem in razpoložljivi RAM). Za dostop do vrednosti, shranjene v kazalcu, morate namesto lokacije v pomnilniku dereferenca kazalec. Ta neposredno dostopa do vrednosti, ki bi bila v tem primeru številka ena. Tukaj je opisano, kako usmerite kazalec:
int številoTwo = * številoOne;
The odstranjevalec je zvezdica (*).
To je težko razumeti, zato preučimo to še enkrat:
- The naslov operator (&) shrani pomnilniški naslov.
- The odstranjevalec (*) dostopa do vrednosti.
Sintaksa se pri razglasitvi kazalcev rahlo spremeni:
int * myPointer;
Podatkovna vrsta int tukaj se nanaša na podatkovni tip kazalec točk na in ne vrsto kazalca samega.
Zdaj, ko veste, kaj so kazalci, lahko z njimi naredite nekaj res čednih trikov! Ko se uporablja pomnilnik, se zažene vaš operacijski sistem zaporedno. RAM si lahko predstavljate kot luknje golobov. Veliko lukenj za shranjevanje nečesa, hkrati lahko uporabite samo eno. Razlika je v tem, da so te luknje za golobe oštevilčene. Ko dodelite pomnilnik, se vaš operacijski sistem zažene pri najnižji številki in deluje. Nikoli ne bo skakalo naokoli med naključnimi števili.

Če ste dodelili matriko, lahko pri delu s kazalci preprosto premikate do naslednjega elementa, tako da preprosto povečate kazalec.
Tukaj je zanimivo. Ko prenesete vrednosti v funkcijo (z uporabo spremenljivk, ki so shranjene v skladu), se te vrednosti kopirajo v vašo funkcijo. Če gre za velike spremenljivke, jih program zdaj shrani dvakrat. Ko je vaša funkcija končana, boste morda potrebovali način, kako vrniti te vrednosti. Funkcije lahko na splošno vrnejo samo eno stvar - kaj pa, če bi želeli vrniti dve, tri ali štiri stvari?

Če podate kazalec na svojo funkcijo, se kopira samo spominski naslov (kar je majhen). To prihrani vaš CPU veliko dela! Mogoče vaš kazalec kaže na ogromen niz slik - ne samo, da lahko vaša funkcija deluje popolnoma enako Podatki so shranjeni na popolnoma istem pomnilniškem mestu, vendar ko to storite, vam ni treba vračati karkoli. Čisto!
Morate biti zelo previdni. Kazalci lahko še vedno izstopijo in jih zbira smeti. Vrednosti, shranjene v pomnilniku, se ne zberejo. Temu pravimo puščanje spomina. Do podatkov ne morete več dostopati (ker so kazalci uničeni), vendar še vedno porablja pomnilnik. To je pogost razlog, da se številni programi zrušijo, in kljub velikemu številu podatkov lahko ne uspe. Vaš operacijski sistem bo večino časa uničil vaš program, če imate velik puščanje (uporabljate več RAM-a, kot ga ima sistem), vendar to ni zaželeno.

Odpravljanje kazalcev je lahko nočna mora, še posebej, če delate z veliko količino podatkov ali delate v zankah. Njihove pomanjkljivosti in težave pri razumevanju so resnično vredne kompromisov, ki jih dobite z uspešnostjo. Čeprav si zapomnite, jih morda ne bo vedno potrebno.
To je danes za danes. Upam, da ste se naučili kaj koristnega o zapleteni temi. Seveda nismo zajeli vsega, kar je treba vedeti - to je zelo zapletena tema. Če vas zanima kaj več, toplo priporočam C ++ v 24 urah.
Če je bilo to nekoliko zapleteno, si oglejte naš vodič po najlažjih programskih jezikih 6 najlažjih jezikov za programiranje za začetnikeNaučiti se programirati je iskanje pravega jezika prav toliko, kolikor gre za postopek edifikacije. Tu je prvih šest najlažjih programskih jezikov za začetnike. Preberi več .
Ste se naučili, kako danes delujejo kazalci? Ali imate kakšne nasvete in trike, ki jih želite deliti z drugimi programerji? Skočite v komentarje in delite svoje misli spodaj!
Joe je diplomirani iz računalništva na Univerzi v Lincolnu v Veliki Britaniji. Je profesionalni razvijalec programske opreme, in ko ne leti z droni ali piše glasbe, ga je pogosto mogoče fotografirati ali ustvarjati videoposnetke.