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;
}