Uvod u Pokaze za programere

  • William Charles
  • 0
  • 2997
  • 464
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 ćete možda htjeti provjeriti kako rade matrice i popisi Kako rade nizovi i popisi u Pythonu. Kako nizovi i popisi rade u Python nizovima i popisima su neke od najkorisnijih struktura podataka u programiranju - - iako ih malo ljudi koristi u svom punom potencijalu. za programski temelj. Ovaj će se članak temeljiti više na teoriji nego inače, ali držati se toga, pokazatelji su vrlo složeni!

Kôd za sastavljanje

Prije kopanja po pokazivačima trebate razumjeti kako se šifra gradi i izvršava - možda to već znate. Ovaj će odjeljak sadržavati prilično opće stavke - stvari koje se primjenjuju na većina jezika, ali ne nužno i svih njih.

Vratimo stvari na početak. Svako računalo koristi binarno Što je binarno? [Objasnio tehnologiju] Što je binarno? [Objasnio tehnologiju] S obzirom da je binarnost tako apsolutno temeljna za postojanje računala, čini se čudnim da se nikad prije nismo bavili tom temom - pa bih danas pomislio da ću dati kratak pregled onoga što je binarni…, serija od onih i nula koje čine modernu tehnologiju kakvu poznajemo. Iznimno je teško kodirati bilo šta u binarnom formatu (datoteke bi bile vrlo zbunjujuće), jer su ovo neobrađene upute koje su vam potrebne Središnja procesorska jedinica ili CPU da funkcionira Što je CPU i što 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 pomognemo objasniti razliku! , 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.

Mnoge video igre i aplikacije visokih performansi imaju određenu logiku zapisanu u montaži, jer se mogu utvrditi određena stvarna povećanja brzine ako znate što radite. Međutim, za veliku većinu programa programiranja uopće ne trebate znati nijedan sklop.

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 jezici dolaze. 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 zasigurno 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 do kompilacije. Kompajler je program koji vaš kôd visoke razine pretvara u oblik koji se može izvršiti. To bi mogao biti još jedan jezik visoke razine, ali to je obično sastavljanje. Neki jezici (kao što su Python ili Java) pretvaraju vaš kod u međufazni stupanj koji se zove bajt. Ovo ć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 prilično je popularna.

Upravljanje memorijom

Sada kada znate kako funkcioniraju jezici programiranja, pogledajmo upravljanje memorijom na jezicima visoke razine. Za ove primjere koristit ću pseudo kod - kod napisan ne na bilo kojem određenom jeziku, ali će se koristiti za prikaz koncepata, a ne točne sintakse. Danas će to uglavnom podsećati na C ++ jer je to najbolji jezik visoke razine (po mom mišljenju).

U ovom ćete odjeljku biti od pomoći ako imate razumijevanja za rad RAM-a. Brzi i prljavi vodič za RAM: Što trebate znati Brzi i prljavi vodič za RAM: Što trebate znati RAM je najvažnija komponenta svakog računala , ali to može biti zbunjujuće. Raščlanjujemo ga na jednostavan način shvatiti. .

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 to i dalje moraju raditi.

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 prostor dovoljno velik da pohranite cijeli broj”

Nakon izvršavanja ove naredbe drugi program ne može koristiti taj dio memorije. Još ne sadrži podatke, ali rezervirano je za varijablu myNumber.

Sada dodijelite vrijednost vašoj varijabli:

moj broj = 10;

Da biste dovršili ovaj zadatak, vaše računalo pristupa rezerviranom memorijskom mjestu i mijenja svaku vrijednost koja je tamo spremljena, 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 sakupljač smeća, koristi se za uništavanje varijabli (i zato oslobađanje rezerviranih memorijskih mjesta) koje su otišle izvan dosega.

Možda se pitate što je opseg i zašto je to toliko važno. Opseg definira granice i vijek trajanja varijabli ili bilo koje memorije koju koristi program. Varijabla je “izvan dosega” kada mu više ne može pristupiti nijedan kôd (to je kad uđe 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 funkcija, tako da je to njegov domet. Ne može mu se pristupiti izvan funkcije u kojoj je proglašen. Ovo je važan programski koncept, a razumijevanje je ključno za rad s pokazateljima.

Ovakav način rukovanja memorijom naziva se stog. To je način na koji radi velika većina programa. Ne morate razumjeti pokazivače da biste ga koristili i prilično je dobro strukturiran. Nedostatak snopa 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 čini drugačijim “redovan” varijable na hrpi, ali vjerujte mi, postoji ogromna razlika. Pokazivači se pohranjuju na hrpa. Ovo je suprotno od hrpe - manje je organiziran, ali je mnogo brži.

Pogledajmo kako su varijable dodijeljene na snopu:

int brojOne = 1; int brojTwo = brojOne;

Ovo je jednostavna sintaksa; Varijabla broj dva sadrži broj jedan. Vrijednost je kopirana tijekom dodjele s broj jedan varijabla.

Ako želite dobiti memorijska adresa varijable, umjesto njene vrijednosti, morate koristiti 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 memorijsko mjesto. Ako želite izvesti ovu varijablu, ona ne bi bila broj jedan (iako je spremljena na memorijskoj lokaciji). Izdvojio bi svoju 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 odlijepiti pokazivač:

int brojTwo = * brojOne;

dereference operator je zvjezdica (*).

To može biti težak razumljiv pojam, pa ga 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. O RAM-u možete razmišljati kao o golubim rupama. 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 dodjeljuje memoriju, vaš se operativni sustav pokreće s najmanjim brojem i nadograđuje. Nikad 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 postaje zanimljivo. Kad proslijedite vrijednosti funkciji (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. Kada 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 pokaž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 istim podacima koji su pohranjeni na točno istom memorijskom mjestu, već nakon što to učinite, nema potrebe ništa vraćati. 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 (koristeći više RAM-a nego što ga ima sustav), ali to nije poželjno.

Otklanjanje pogrešaka može biti noćna mora, posebno ako radite s velikim količinama 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 pokrenuli sve što se mora znati - to je vrlo složena tema. Ako ste zainteresirani za učenje više, toplo preporučujem C ++ u roku od 24 sata.

Ako vam je ovo pomalo složeno, pogledajte naš vodič o najlakšim programskim jezicima. 6 Najlakši programski jezici za učenje za početnike 6 Najlakši programski jezik za učenje za početnike Učenje za program znači pronalaženje pravog jezika jednako koliko i o proces izgradnje. Slijedi prvih šest najlakših programskih jezika za početnike. .

Jeste li naučili kako danas rade pokazivači? Imate li savjete i trikove koje želite podijeliti s ostalim programerima? Uskočite u komentare i podijelite svoja razmišljanja u nastavku!




Još ne komentari

O modernoj tehnologiji, jednostavnoj i pristupačnoj.
Vaš vodič u svijetu moderne tehnologije. Naučite kako koristiti tehnologije i uređaje koji nas okružuju svaki dan i naučite kako otkriti zanimljivosti na Internetu.