Nou Generator de prompt AI — scrie prompturi mai bune pentru ChatGPT, Claude și Gemini →

Aritmetica pointerilor în C

Adunarea și scăderea pe pointeri se fac în elemente, nu în octeți: p + 1 arată spre următorul element din tablou.

Sintaxă
p + n      // adresa elementului cu n poziții mai departe
p++ / p--  // următorul / precedentul element
q - p      // câte elemente sunt între ele (ptrdiff_t)
p[i]       // același lucru cu *(p + i)

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 + 1 adaugă un octet. Adaugă un element; pentru a lucra pe octeți, convertește la char * sau unsigned 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.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Aritmetica pointerilor

Ai o nelămurire despre utilizarea comenzii Aritmetica pointerilor sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.