Pokazivač (programiranje)

Izvor: Hrvatska internetska enciklopedija
Prijeđi na navigaciju Prijeđi na pretraživanje
Pokazivač a na adresi 0002 pokazuje na memorijsku adresu povezanu s varijablom b, to jest a sadrži memorijsku adresu 1008 varijable b. U ovom dijagramu računalna arhitektura rabi isti adresni prostor i primitivnu vrstu podataka i za pokazivače i za nepokazivače; to općenito ne mora biti slučaj.

U računalnom programiranju, pokazivač (engl. pointer) u mnogim je programskim jezicima primitivni objekt koji pohranjuje memorijsku adresu. To može biti adresa druge vrijednosti koja se nalazi u memoriji računala ili, rjeđe, vrijednost memorijski mapiranog hardvera. Pokazivač upućuje na lokaciju u memoriji, a dobivanje vrijednosti pohranjene na toj lokaciji poznato je kao dereferenciranje pokazivača. Stvarni format i sadržaj varijable pokazivača ovisi o temeljnoj arhitekturi računala.

Upotreba pokazivača značajno poboljšava performanse za repetitivne operacije, poput prolaska kroz iterabilne strukture podataka (npr. nizove znakova, tablice za pretraživanja, kontrolne tablice, povezane liste i strukture stabla). Posebno je često puno jeftinije, u pogledu vremena i prostora, kopirati i dereferencirati pokazivače nego kopirati i pristupati podacima na koje pokazivači pokazuju.

Pokazivači se također koriste za držanje adresa ulaznih točaka za pozvane potprograme u proceduralnom programiranju i za povezivanje s dinamičkim bibliotekama (DLL) tijekom izvođenja. U objektno orijentiranom programiranju pokazivači na funkcije se koriste za povezivanje metoda, često korištenjem tablica virtualnih metoda.

Pokazivač je jednostavna, konkretnija implementacija apstraktnijeg referentnog tipa podataka. Nekoliko jezika, posebno jezici niske razine, podržava neku vrstu pokazivača, iako neki imaju više ograničenja u korištenju od drugih. Budući da pokazivači omogućuju i zaštićen i nezaštićen pristup memorijskim adresama, postoje rizici povezani s njihovim korištenjem, posebno u potonjem slučaju. Primitivni pokazivači se često pohranjuju u formatu sličnom cijelom broju; međutim, pokušaj dereferenciranja ili "pretraživanja" takvog pokazivača čija vrijednost nije valjana memorijska adresa mogao bi uzrokovati rušenje programa ili sadržavati nevažeće podatke. Kako bi se ublažio ovaj potencijalni problem, iz razloga sigurnosti tipova, pokazivači se smatraju zasebnim parametriziranim tipom podataka na koje pokazuju, čak i ako je temeljna reprezentacija cijeli broj. Mogu se poduzeti i druge mjere (poput validacije i provjere granica) kako bi se provjerilo sadrži li varijabla pokazivača vrijednost koja je i valjana memorijska adresa i unutar numeričkog raspona koji procesor može adresirati.

Povijest

Godine 1955. sovjetska-ukrajinska računalna znanstvenica Katerina Juščenko stvorila je programski jezik Address koji je omogućio neizravno adresiranje i adrese najvišeg ranga - analogno pokazivačima. Jezik se široko koristio na računalima Sovjetskog Saveza. Međutim, izvan Sovjetskog Saveza bio je nepoznat i obično se Haroldu Lawsonu pripisuje izum pokazivača 1964. godine.[1] Godine 2000. Lawsonu je IEEE dodijelio nagradu Computer Pioneer Award »za izum pokazivačke varijable i uvođenje ovog koncepta u PL/I, čime je prvi put omogućena fleksibilna obrada povezanih lista u općem programskom jeziku visoke razine«.[2] Njegov ključni rad o tim konceptima objavljen je u izdanju CACM-a iz lipnja 1967. pod naslovom: Obrada PL/I popisa.

Formalni opis

Primitivni podatak je bilo koji podatak koji se može pročitati iz ili zapisati u memoriju računala upotrebom jednog pristupa memoriji (na primjer, i bajt i riječ su primitivi).

Agregat podataka (ili samo agregat) je skupina primitivnih podataka koji su logički susjedni u memoriji i koji se zajedno promatraju kao jedan podatak (na primjer, agregat može biti 3 logički susjedna bajta, čije vrijednosti predstavljaju 3 koordinate točke u prostoru). Kada je agregat u potpunosti sastavljen od iste vrste primitivnih podataka, agregat se može nazvati nizom; u određenom smislu, višebajtna primitiva riječi je niz bajtova, a neki programi koriste riječi na taj način.

Pokazivač memorije (ili samo pokazivač) primitivni je podatak čija se vrijednost koristi kao memorijska adresa; kaže se da pokazivač pokazuje na memorijsku adresu. Također se kaže da pokazivač pokazuje na podatak [u memoriji] kada je vrijednost pokazivača memorijska adresa podatka.

Općenito, pokazivač je vrsta reference, a kaže se da pokazivač referencira podatak pohranjen negdje u memoriji ; dobivanje tog podatka znači dereferenciranje pokazivača. Značajka koja razdvaja pokazivače od drugih vrsta referenci jest ta što se vrijednost pokazivača treba interpretirati kao memorijska adresa, što je prilično niskorazinski koncept.

Upotreba

Pokazivači su izravno podržani bez ograničenja u jezicima kao što su PL/I, C, C++, Pascal, FreeBASIC, a implicitno u većini asemblerskih jezika. Koriste se uglavnom za konstruiranje referenci, koje su pak temeljne za konstruiranje gotovo svih struktura podataka, kao i za prijenos podataka između različitih dijelova programa.

Pri radu s nizovima kritična operacija pretraživanja obično uključuje fazu nazvanu izračun adrese, koja uključuje konstruiranje pokazivača na željeni podatkovni element u nizu. U drugim strukturama podataka, kao što su vezane liste, pokazivači se koriste kao reference za eksplicitno povezivanje jednog dijela strukture s drugim, što može biti u jednom smjeru ili u oba, kada svaka struktura sadrži pointer i na prethodnu i na sljedeću strukturu u nizu.

Pokazivači se koriste za prosljeđivanje parametara putem reference. Ovo je korisno ako programer želi da izmjene parametra koje je funkcija izvršila budu vidljive pozivatelju funkcije. Ovo je također korisno za vraćanje više vrijednosti iz funkcije.

Pokazivači se također mogu koristiti za alokaciju i dealokaciju dinamičkih varijabli i nizova u memoriji. Budući da varijabla često postaje suvišna nakon što ispuni svoju svrhu, njezino čuvanje predstavlja gubitak memorije, stoga je dobra praksa dealocirati je (koristeći izvornu referencu pokazivača) kada više nije potrebna. Ako se to ne učini, može doći do curenja memorije (tamo gdje je dostupna slobodna memorija postupno se smanjuje, ili u težim slučajevima brzo, zbog nakupljanja brojnih redundantnih memorijskih blokova).

Sigurna upotreba pokazivača

Budući da pokazivač omogućuje programu pokušaj pristupa objektu koji možda nije definiran, pokazivači mogu biti izvor raznih programskih pogrešaka. Međutim, korisnost pokazivača je toliko velika da može biti teško izvršavati programske zadatke bez njih. Posljedično, mnogi jezici su stvorili konstrukte osmišljene da pruže neke od korisnih značajki pokazivača bez nekih njihovih nedostataka.

Jedan od glavnih problema s pokazivačima je taj što sve dok se njima može izravno manipulirati kao brojevima, mogu se natjerati da pokazuju na nekorištene adrese ili na podatke koji se koriste u druge svrhe. Mnogi jezici, uključujući većinu funkcionalnih programskih jezika i novije imperativne programske jezike poput Jave, zamjenjuju pokazivače neprozirnijom vrstom reference, obično nazvanom jednostavno referencom, koja se može koristiti samo za pozivanje na objekte, a ne manipulirati njome kao brojevima, sprječavajući ovu vrstu pogreške. Indeksiranje nizova se tretira kao poseban slučaj.

Izvori

  1. • Nepoznat parametar: url-access
    • Parametar access-date nije dopušten u klasi book
  2. IEEE Computer Society awards list. Awards.computer.org 0. Pristupljeno 2018-04-13.