Oglas
Bilo da to shvatite ili ne, velika većina programa koje ste koristili na neki način koristi pokazivače. Možda ste iskusili a NullPointerException u nekom trenutku. Kao programer, kod koji napišete više će nego vjerovatno koristiti pokazivače, čak i ako ih sami niste implementirali.
Danas ću vam pokazati kako rade pokazivači pa biste mogli provjeriti kako rade nizovi i popisi Kako rade nizovi i popisi u PythonuNizovi i popisi neke su od najkorisnijih struktura podataka u programiranju - iako ih malo ljudi koristi u potpunosti. Čitaj više za programski temelj. Ovaj će se članak temeljiti više na teoriji nego inače, ali drži se toga, pokazatelji su vrlo složeni!
Kôd za sastavljanje
Prije kopanja po pokazateljima morate shvatiti kako se šifra gradi i izvršava - možda to već znate. U ovom će se odjeljku nalaziti prilično općenite izjave - stvari koje se odnose na većina jezika, ali ne nužno i svih njih.
Vratimo stvari na početak Svako računalo koristi binarni Što je binarno? [Objašnjena tehnologija] S obzirom na to da je binarnost tako apsolutno bitna za postojanje računala, čini se čudnim da se nikad nismo bavili tom temom - pa danas bih pomislio da ću dati kratak pregled onoga što binarno okruženje ... Čitaj više , niz istih i nula koje čine modernu tehnologiju kakvu poznajemo. Izuzetno je teško bilo šta kodirati u binarne datoteke (datoteke bi bile vrlo zbunjujuće), jer su ovo sirove upute potrebne Središnja procesorska jedinica ili CPU radi Što je CPU i što radi?Računarne kratice su zbunjujuće. Što je CPU uopće? A trebam li četverojezgreni ili dvojezgreni procesor? Što kažete na AMD ili Intel? Tu smo da vam pomognemo objasniti razliku! Čitaj više . To je poznato kao Strojni kod.
Sljedeći korak je strojni kod Skupština. To je pomalo ljudski čitljiv format. Iako je programiranje još uvijek složeno, moguće je. Montaža se sastoji od niza jednostavnih naredbi za izvršavanje zadataka, a poznata je kao a niska razina programski jezik. Moguće je pisati složene programe, ali teško je izraziti apstraktne pojmove i zahtijeva puno razmatranja.
Mnogo video igara i visokih performansi imaju neku logiku zapisanu pri sklapanju, jer se mogu utvrditi određena stvarna povećanja brzine ako znate što radite. Međutim, za veliku većinu programskih projekata ne morate uopće znati nijedan skup.
Dakle, ako je strojni kod previše teško napisati, a sastavljanje je preteško programirati, s čime pišete kod? Evo gdje visoka razina ulaze jezici. Jezici visoke razine olakšavaju pisanje programa. Možete programirati na nešto što nalikuje vašem materinjem jeziku, a lako je izraziti složene algoritme. Možda ste čuli za mnoge jezike visoke razine (i sigurno ste koristili program napisan na njima):
- OSNOVNI, TEMELJNI
- C ++
- šuškati
Ovi su jezici sada vrlo stari, a mnogi su razvijeni u ranim pedesetima! Gotovo svaki moderni programski jezik je jezik visoke razine, uključujući PHP i Python. Svakodnevno se izmišlja više jezika (iako ih je sada vjerojatno dovoljno), ali kako točno vaš kôd i dalje ispravno radi ako računala zahtijevaju strojni kod?
Evo gdje dolazi kompilacija Kompajler je program koji vaš kôd visoke razine pretvara u oblik koji se može izvršiti. To bi mogao biti drugi jezik visoke razine, ali to je obično sastavljanje. Neki jezici (kao što su Python ili Java) pretvaraju vaš kôd u srednju fazu koja se zove bajt. To će trebati kasnije sastaviti, što se obično vrši na zahtjev, primjerice kada se program pokrene. To je poznato kao na vrijeme kompilacije, a vrlo je popularna.
Upravljanje memorijom
Sada kada znate kako rade programski jezici, pogledajmo upravljanje memorijom na jezicima visoke razine. Za ove ću primjere koristiti pseudo kod - kod napisan ne na bilo kojem određenom jeziku, ali se koristi za prikazivanje koncepata, a ne točne sintakse. Danas će to uglavnom podsećati na C ++ kao najbolji jezik na visokoj razini (po mom mišljenju).
U ovom ćete odjeljku pomoći ako imate razumijevanja kako radi RAM Brzi i prljavi vodič za RAM: Što trebate znatiRAM je bitna komponenta svakog računala, ali može biti zbunjujuće. Raščlanjujemo ga na jednostavan način shvatiti. Čitaj više .
Većina jezika ima varijable - spremnike koji pohranjuju neke podatke. Morate izričito definirati vrstu podataka. Neki dinamički tipkani jezici, poput Pythona ili PHP-a, to rade za vas, ali oni to još uvijek moraju učiniti.
Recite da imate varijablu:
int myNumber;
Ovaj kôd deklarira varijablu nazvanu moj broj, i daje mu tip podataka broj. Nakon sastavljanja, računalo ovu naredbu tumači kao:
"Pronađite praznu memoriju i rezervirajte dovoljno prostora da pohranite cijeli broj"
Nakon što se izvrši ova naredba, drugi program memorije ne može koristiti drugi program. Još ne sadrži podatke, ali rezervirano je za vašu varijablu myNumber.
Sada dodijelite vrijednost varijabli:
myNumber = 10;
Da biste dovršili taj zadatak, vaše računalo pristupa rezerviranom memorijskom mjestu i mijenja vrijednost koja je tamo pohranjena u novu vrijednost.
E sad, sve je to dobro i dobro, ali kako memorijske lokacije postaju bezrezervne? Ako bi programi rezervirali svu memoriju koja im se sviđa, RAM bi se odmah napunio - to bi značilo vrlo spor sustav.
Da bi se izbjegao ovaj potencijalni problem, mnogi jezici implementiraju a sakupljač smeća, koristi se za uništavanje nestalih varijabli (i zato oslobađanje rezerviranih memorijskih mjesta) izvan dosega.
Možda se pitate što je opseg i zašto je to tako važno. Opseg definira granice i vijek trajanja varijabli ili bilo koje memorije koju koristi program. Varijabla je "izvan dometa" kad joj više ne može pristupiti nijedan kôd (to je kada ulazi sakupljač smeća). Evo primjera:
funkcija maths () {int firstNumber = 1; } int secondNumber = 2; ispis (firstNumber + secondNumber); // neće raditi
Ovaj se primjer neće sastaviti. Varijabla firstNumber nalazi se unutar matematika funkciju, tako da je to u njezinu djelokrugu. Ne može mu se pristupiti izvan funkcije u kojoj je proglašen. Ovo je važan programski koncepti razumijevanje presudno je za rad s pokazateljima.
Ovakav način rukovanja memorijom naziva se stog. To je način na koji djeluje velika većina programa. Ne morate razumjeti pokazivače da biste ga koristili i prilično je dobro strukturiran. Nedostatak hrpe je brzina. Kako računalo mora dodijeliti memoriju, pratiti varijable i pokrenuti sakupljanje smeća, postoji mali pretprostor. To je u redu za manje programe, ali što je sa zadacima visokih performansi ili velikim podacima?
Unesite: pokazivači.
pokazivači
Na površini pokazivači zvuče jednostavno. Oni se odnose (ukazati na) mjesto u memoriji. Ovo se možda ne razlikuje od "redovitih" varijabli na hrpi, ali vjerujte mi, postoji ogromna razlika. Pokazivači se pohranjuju na hrpa. Ovo je suprotno od snopa - manje je organiziran, ali je mnogo brži.
Pogledajmo kako se varijable dodjeljuju na nizu:
int brojOne = 1; int brojTwo = brojOne;
Ovo je jednostavna sintaksa; Varijabla broj dva sadrži broj jedan. Vrijednost je kopirana tijekom dodjele iz broj jedan promjenjiva.
Ako želite dobiti memorijska adresa varijable, umjesto njene vrijednosti, morate upotrijebiti znak ampersand (&). To se naziva adresu operatora, i bitan je dio vašeg alata za pokazivanje.
int brojOne = 1; int brojTwo = & brojOne;
Sada je broj dva varijabla bodova na memorijsko mjesto, umjesto da prebacujete broj jedan na svoje novo, novo memorijsko mjesto. Ako biste ispratili ovu varijablu, ona ne bi bila broj jedan (iako je spremljena na memorijskoj lokaciji). To bi odabralo memorijsku lokaciju (vjerojatno poput 2167, iako varira ovisno o sustavu i dostupnoj RAM-u). Za pristup vrijednosti pohranjenoj u pokazivaču, umjesto na memorijskoj lokaciji, morate dereference pokazivač. Time se izravno pristupa vrijednosti koja bi u ovom slučaju bila broj jedan. Evo kako preusmjeriti pokazivač:
int brojTwo = * brojOne;
dereference operator je zvjezdica (*).
Ovo može biti težak pojam, pa neka ponovo razmotrimo:
- adresu operator (&) pohranjuje memorijsku adresu.
- dereference operator (*) pristupa vrijednosti.
Sintaksa se lagano mijenja kada deklarira pokazivače:
int * myPointer;
Vrsta podataka za int ovdje se odnosi na vrstu podataka pokazivač bodova na, a ne vrstu samog pokazivača.
Sada kada znate što su pokazivači, možete napraviti neke stvarno uredne trikove s njima! Kad se koristi memorija, pokreće se vaš operativni sustav sekvencijalno. Možete razmišljati o RAM-u kao rupicama golubova. Mnogo rupa za pohranu nečega, odjednom se može koristiti samo jedna. Razlika je u tome što su ove rupe za golubove numerirane. Kad dodjeljujete memoriju, vaš se operativni sustav pokreće s najmanjim brojem i nadograđuje. Nikada neće skakati između slučajnih brojeva.
Ako radite s pokazivačima, ako ste dodijelili niz, možete jednostavno prijeći na sljedeći element jednostavnim povećanjem pokazivača.
Evo gdje to postaje zanimljivo. Kad prenesete vrijednosti u funkciju (koristeći varijable spremljene u snopu), te se vrijednosti kopiraju u vašu funkciju. Ako su to velike varijable, program ih sad pohranjuje dva puta. Kad je funkcija završena, možda će vam trebati način da vratite te vrijednosti. Funkcije uglavnom mogu vratiti samo jednu stvar - pa što ako želite vratiti dvije, tri ili četiri stvari?
Ako ukažete pokazivač na svoju funkciju, kopira se samo memorijska adresa (što je maleno). To štedi vaš CPU puno posla! Možda vaš pokazivač ukazuje na ogroman niz slika - ne samo da vaša funkcija može raditi na potpuno isti način podaci pohranjeni na potpuno istoj memorijskoj lokaciji, ali nakon što to učinite, više se nema potrebe vraćati bilo što. Uredan!
Ipak morate biti vrlo oprezni. Pokazivači i dalje mogu izaći izvan dosega i prikupiti ih skupljač smeća. Vrijednosti pohranjene u memoriji ipak se ne sakupljaju. To se naziva curenje memorije. Ne možete više pristupati podacima (jer su pokazivači uništeni), ali to i dalje troši memoriju. To je čest razlog rušenja mnogih programa i može se spektakularno pokvariti ako postoji velika količina podataka. Većinu vremena vaš će operativni sustav ubiti vaš program ako imate veliko curenje (koristite više RAM-a nego što sustav ima), ali to nije poželjno.
Otklanjanje pogrešaka može biti noćna mora, posebno ako radite s velikom količinom podataka ili radite u petlji. Njihovi nedostaci i poteškoće za razumijevanje zaista su vrijedni popusta koji postižete u radu. Iako zapamtite, možda ih neće uvijek trebati.
To je to za danas. Nadam se da ste naučili nešto korisno o složenoj temi. Naravno, nismo obuhvatili sve što se mora znati - to je vrlo složena tema. Ako ste zainteresirani za učenje više, toplo preporučujem C ++ za 24 sata.
Ako vam je ovo bilo malo složeno, pogledajte naš vodič za najlakše programske jezike 6 najlakših jezika za programiranje za učenje za početnikeNaučiti programirati znači pronalaženje pravog jezika jednako koliko i postupak edifikacije. Slijedi prvih šest najlakših programskih jezika za početnike. Čitaj više .
Jeste li naučili kako danas rade pokazivači? Imate li savjete i trikove koje želite podijeliti s drugim programerima? Uskočite u komentare i podijelite svoja razmišljanja u nastavku!
Joe je diplomski studij informatike na Sveučilištu u Lincolnu u Velikoj Britaniji. On je profesionalni programer softvera, a kad ne leti dronovima ili piše glazbu, često ga mogu naći fotografirati ili snimati videozapise.