Pokazivači i nizovi
Da ponovimo:
- Pokazivač je promenljiva koja sadrži adresu druge promenljive
- Pokazivač može biti bilo kog tipa, ali adrese koje sadrži moraju biti od promenljivih istog tipa
- Operator & daje "adresu od promenljive"
- Operator * daje "sadržaj lokacije na koju pokazivač pokazuje"
- Pokazivač se definiše kao i obična promenljiva ali se ispred imena postavlja *
- (na primer: int *pok; )
- Obratiti pažnju da je pokazivač inicijalizovan pre dereferenciranja (pristupanje sadržaju)
Pokazivači i nizovi
U C-u postoji jaka veza između pokazivača i nizova - toliko jaka da pokazivači i nizovi treba da se istovremeno razmatraju. Svaka operacija koja se može postići indeksiranjem niza moža se uraditi i sa pokazivačima (brže se izvršava ali je za početnike teže za razumevanje).
Deklaracija
int a[10];

Deklaracija int a[10]; deklariše niz veličine 10. Početni element je a[0], a deseti element je a[9] i oni su poredani uzastopno u memoriji. Imenu niza a pridružena je informacija o adresi početnog elementa niza, o tipu elemenata niza, kao i o broju elemenata niza. Treba da vodite računa o sledećem: ime niza a uvek ukazuje na isti prostor koji je rezervisan za elemente niza. Dakle, vrednost a nije pokazivačkog tipa, ali mu je vrlo bliska.
Nakon deklaracije int a[10], vrednosti a odgovara pokazivač na prvi element niza, vrednosti a+1 odgovara pokazivač na drugi element niza, itd. Dakle, umesto a[10] može se pisati *(a+i), a umesto &a[i] može se pisati a+i.
Kao i obično, nema provere granica niza, pa je moguće pisati (tj. prolazi fazu prevođenja) i a[100], *(a+100), a[-100], *(a-100), iako je veličina niza samo 10. U fazi izvršavanja, pristupanje ovim lokacijama može da promeni vrednost drugih promenljivih koje se nalaze na tim lokacijama ili da dovede do prekida rada programa zbog pristupanja memoriji koja mu nije dodeljena.
-Da se vratimo našem nizu:
Zapis a [ i ] ukazuje na element niza koji se nalazi na i-tom mestu posle početka. Ako je pa pokazivač na neki ceo broj, deklarisan pomoću
int *pa;
tada dodeljivanje
pa = &a [ 0 ];
podešava pa da pokazuje na nulti element niza a, to jest pa sadrži adresu od a [ 0 ].
(Ovo isto smo mogli pisati kao pa = a !!)
Ako uradimo sledeće:
x = pa;
tada će se u promenljivu x kopirati sadržaj elementa a[0].
Ako pa pokazuje na određeni elemenat nekog niza, tada po definiciji pa+1 pokazuje na naredni elemenat, pa+i pokazuje na i elemenata iza pa, a pa-i pokazuje i elemenata ispred pa. Zato, ako pa pokazuje na a[0],
*(pa+1)
ukazuje na sadržaj elementa a[1], pa+i je adresa elementa a[i], a *(pa+i) je sadržaj elementa a[i].
Ove napomene su tačne bez obzira na tip ili veličinu promenljivih u nizu a. Značenje fraze "dodavanje 1 pokazivaču", i po analogiji cele pokazivačke aritmetike, je da pa+1 pokazuje na naredni objekat, a pa+i pokazuje na i-ti objekat iza pa.
Korespodencija između indeksiranja i pokazivačke aritmetike je vrlo bliska. Po definiciji, vrednost promenljive ili izraza tipa niza je adresa nultog elementa tog niza. Tako nakon dodeljivanja
pa = & a [ 0 ] ;
pa i a imaju identične vrednosti. Pošto je ime niza sinonim za lokaciju početnog elementa niza, dodela pa=&a[0] se može napisati i ovako
pa = a;
Možda izgleda čudno (bar na prvi pogled) činjenica da a[i] znači isto što i *(a+i). Prilikom izračunavanja izraza a[i], C ga odmah pretvara u *(a+i) - ova dva oblika su ekvivalentna. Ako bi primenili operator & na oba ta izraza videli bi da su izrazi &a[i] i a+i identični: a+i je adresa i-tog elementa iza a. Sa druge strane, ako je pa pokazivač, u izrazima se on može koristiti sa indeksom: pa[i] je identično izrazu *(pa+i). Ukratko, izraz "niz i indeks" je ekvivalentan onom napisanom u obliku "pokazivač i relativno odstojanje".
Postoji jedna razlika između imena niza i pokazivača koju stalno moramo imati na umu. Pokazivač je promenljiva, pa su izrazi pa=a i pa++ dozvoljeni. Međutim, ime niza nije promenljiva pa konstrukcije kao što su a=pa ili a++ NISU DOZVOLJENE.
*** Ako ste sigurni da elementi postoje u nekom nizu, možete ih indeksirati i unazad: pa[-1], pa[-2] i tako dalje, su sintaksno dozvoljeni i ukazuju na elemente koji se nalaze ispred pa[0]. Naravno, nije ispravno koristiti objekte koji nisu unutar granica niza.