Ce face Aritmetica pointerilor
Când aduni 1 la un pointer int *p, adresa crește cu sizeof(int) octeți, adică trece la următorul int. Pentru un double *, crește cu 8. Pointerul „știe” tipul spre care arată.
Numele unui tablou folosit într-o expresie se transformă într-un pointer la primul element. De aceea t[i] este definit ca *(t + i), iar parcurgerea unui tablou se poate face și cu un pointer care avansează.
Diferența a doi pointeri din același tablou este numărul de elemente dintre ei, de tip ptrdiff_t (afișat cu %td). Aritmetica este permisă doar în interiorul aceluiași tablou și până la poziția imediat de după ultimul element.
Exemple
Exemplul 1: p + 1 sare un element întreg
Diferența în octeți dintre p + 1 și p este dimensiunea tipului: 4 pentru int, 8 pentru double.
#include <stdio.h>
int main(void) {
int note[] = {9, 7, 10};
double preturi[] = {12.5, 30.0};
int *p = note;
double *d = preturi;
printf("*(p + 2) = %d\n", *(p + 2));
printf("octeți între p și p+1: %td\n", (char *)(p + 1) - (char *)p);
printf("octeți între d și d+1: %td\n", (char *)(d + 1) - (char *)d);
return 0;
}
Rezultat
*(p + 2) = 10
octeți între p și p+1: 4
octeți între d și d+1: 8
Exemplul 2: Parcurgerea unui tablou cu un pointer
sfarsit arată imediat după ultimul element (adresă permisă, dar care nu se citește). Bucla avansează p până ajunge acolo.
#include <stdio.h>
int main(void) {
int cantitati[] = {4, 0, 12, 7};
int *sfarsit = cantitati + sizeof cantitati / sizeof cantitati[0];
int total = 0;
for (int *p = cantitati; p != sfarsit; p++) {
total += *p;
}
printf("Total: %d bucăți\n", total);
return 0;
}
Rezultat
Total: 23 bucăți
Exemplul 3: Diferența a doi pointeri
strchr întoarce un pointer la caracterul găsit; scăzând începutul șirului afli poziția lui.
#include <stddef.h>
#include <stdio.h>
#include <string.h>
int main(void) {
const char *email = "ana.pop@exemplu.ro";
const char *aron = strchr(email, '@');
if (aron != NULL) {
ptrdiff_t poz = aron - email;
printf("@ este pe poziția %td\n", poz);
printf("utilizator: %.*s\n", (int)poz, email);
printf("domeniu: %s\n", aron + 1);
}
return 0;
}
Rezultat
@ este pe poziția 7
utilizator: ana.pop
domeniu: exemplu.ro
Greșeli frecvente
- Crezi că
p + 1adaugă un octet. Adaugă un element; pentru a lucra pe octeți, convertește lachar *sauunsigned char *. - Treci cu pointerul în afara tabloului (înainte de primul element sau după poziția de după ultimul). Chiar și doar calculul unei astfel de adrese este comportament nedefinit.
- Scazi pointeri care arată în tablouri diferite. Rezultatul nu are sens și este comportament nedefinit.
- Confunzi
*p++cu(*p)++. Primul avansează pointerul (și citește valoarea veche), al doilea crește valoarea spre care arată.
Comenzi înrudite
Pointeri (& și *): O variabilă care păstrează adresa altei variabile; cu * citești sau modifici valoarea de la acea adresă.Tablouri (array): Un șir de elemente de același tip, așezate unul după altul în memorie și accesate prin index, de la 0.Șiruri de caractere (char[]): În C, un șir de caractere este un tablou de char terminat cu caracterul nul ‘\0’, care marchează sfârșitul textului.strchr și strrchr: Caută un caracter într-un șir: strchr găsește prima apariție, strrchr pe ultima.void * (pointer generic): Un pointer care poate păstra adresa oricărui tip de date, dar care trebuie convertit la un tip concret înainte de folosire.
Întrebări & Exemple de Cod:
Aritmetica pointerilorAi o nelămurire despre utilizarea comenzii
Aritmetica pointerilorsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.