Odnos između nizova i pokazivača u programiranju na C (s primjerima)

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 int4 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 ekvivalentan x+1i x(1)ekvivalentan je *(x+1).
  • &x(2)je ekvivalentan x+2i x(2)ekvivalentan je *(x+2).
  • U osnovi &x(i)je ekvivalentno x+ii x(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 3je prikazano kad smo tiskali *ptr.

I, tisak *(ptr+1)nam daje četvrti element. Slično tome, tisak *(ptr-1)nam daje drugi element.

Zanimljivi članci...