U ovom vodiču naučit ćete o odnosu između nizova i pokazivača u programiranju na C-u. Također ćete naučiti pristupiti elementima niza pomoću pokazivača.
Prije nego što naučite o odnosu nizova i pokazivača, svakako provjerite ove dvije teme:
- C Nizovi
- C Pokazatelji
Odnos između nizova i pokazivača
Niz je blok sekvencijalnih podataka. Napišimo program za ispis adresa elemenata niza.
#include int main() ( int x(4); int i; for(i = 0; i < 4; ++i) ( printf("&x(%d) = %p", i, &x(i)); ) printf("Address of array x: %p", x); return 0; )
Izlaz
& x (0) = 1450734448 & x (1) = 1450734452 & x (2) = 1450734456 & x (3) = 1450734460 Adresa niza x: 1450734448
Između dva uzastopna elementa niza x postoji razlika od 4 bajta. To je zato što je veličina int
4 bajta (na našem kompajleru).
Primijetite da je adresa & x (0) i x ista. To je zato što ime varijable x pokazuje na prvi element niza.
Iz gornjeg primjera jasno je da &x(0)
je ekvivalent x. I, x(0)
ekvivalentno je *x
.
Slično tome,
&x(1)
je ekvivalentanx+1
ix(1)
ekvivalentan je*(x+1)
.&x(2)
je ekvivalentanx+2
ix(2)
ekvivalentan je*(x+2)
.- …
- U osnovi
&x(i)
je ekvivalentnox+i
ix(i)
ekvivalentno je*(x+i)
.
Primjer 1: Pokazivači i nizovi
#include int main() ( int i, x(6), sum = 0; printf("Enter 6 numbers: "); for(i = 0; i < 6; ++i) ( // Equivalent to scanf("%d", &x(i)); scanf("%d", x+i); // Equivalent to sum += x(i) sum += *(x+i); ) printf("Sum = %d", sum); return 0; )
Kada pokrenete program, izlaz će biti:
Unesite 6 brojeva: 2 3 4 4 12 4 Zbroj = 29
Ovdje smo proglasili niz x od 6 elemenata. Za pristup elementima niza koristili smo pokazivače.
U većini konteksta, imena polja raspadaju se do pokazivača. Jednostavnim riječima, nazivi polja pretvaraju se u pokazivače. To je razlog zašto možete koristiti pokazivače za pristup elementima nizova. Međutim, trebali biste zapamtiti da pokazivači i nizovi nisu isto .
Postoji nekoliko slučajeva kada se nazivi polja ne raspadaju do pokazivača. Da biste saznali više, posjetite: Kada se ime niza ne raspada u pokazivač?
Primjer 2: Nizovi i pokazivači
#include int main() ( int x(5) = (1, 2, 3, 4, 5); int* ptr; // ptr is assigned the address of the third element ptr = &x(2); printf("*ptr = %d ", *ptr); // 3 printf("*(ptr+1) = %d ", *(ptr+1)); // 4 printf("*(ptr-1) = %d", *(ptr-1)); // 2 return 0; )
Kada pokrenete program, izlaz će biti:
* ptr = 3 * (ptr + 1) = 4 * (ptr-1) = 2
U ovom je primjeru &x(2)
adresa trećeg elementa dodijeljena pokazivaču ptr. Stoga 3
je prikazano kad smo tiskali *ptr
.
I, tisak *(ptr+1)
nam daje četvrti element. Slično tome, tisak *(ptr-1)
nam daje drugi element.