for (int i = 0; i < size; ++i) { /* foloseste a[i] */ }
for (int i = size; i--; ) { // i e size .. 1 in test inainte de decrementare /* foloseste a[i] */ // si size-1 .. 0 in ciclu, la folosire }
/* declara un pointer p pentru parcurgere, si un pointer end cu adresa la care se termina tabloul; sau se poate compara si direct p < a + size */ for (double *p = a, *end = a + size; p < end; ++p) { printf("%f ", *p); // *p e valoarea de la adresa p }
/* declara un pointer p cu adresa la care se termina tabloul; il decrementeaza pana ajunge la a; p-- testeaza valoarea dinainte de decrementare, testam > a */ for (double *p = a + size; p-- > a; ) { printf("%f ", *p); // *p e valoarea de la adresa p } /* la fel, dar valoarea e decrementata inainte de testare, testam >= a */ for (double *p = a + size; --p >= a; ) { printf("%f ", *p); // *p e valoarea de la adresa p }
Un tablou de n elemente de tipul tip se alocă cu apelul
malloc(n * sizeof(tip)) .
Valoarea returnată se atribuie unui pointer de tipul tip * și se folosește doar după ce s-a verificat că nu e NULL (alocarea a avut succes) .
Un exemplu de funcție care adună doi vectori de reali de aceeași dimensiune și returnează adresa vectorului creat:
double *addvect(double a[], double b[], unsigned len) { double *c = malloc(len * sizeof(double)); if (c) // c e folosit doar dacă e nenul for (int i = len; i--; ) // un pointer poate fi folosit cu indici [i] c[i] = a[i] + b[i]; // ca un tablou (numele tabloului e adresa lui) return c; }
void parcurge(char *s) { for (int i = 0; s[i]; ++i) { /* fa ceva cu caracterul curent s[i] */ } for (char *p = s; *p; ++p) { /* fa ceva cu caracterul curent *p */ } }Dacă sirul de caractere e dat printr-un pointer (și nu adresa constantă de început a unui tablou), și ulterior în acea funcție nu mai avem nevoie de adresa de început a șirului, putem parcurge șirul chiar cu pointerul dat:
char *strchr(const char *s, int c) // cauta caracterul c in sirul s { for (; *s; ++s) // parcurge cat timp *s e nenul if (*s == c) return s; // returneaza adresa unde a fost gasit return NULL; // altfel returneaza NULL: nu a fost gasit }
char *strdup(char *s) { char *p = malloc(strlen(s) + 1); if (p) strcpy(p, s); return p; }