INTRODUZIONE ALLA PROGRAMMAZIONE IN C
Puntatori e array
Un'array di elementi puo' essere pensato come disposto in un insieme di
locazioni di memoria consecutive.
Consideriamo il seguente esempio:
int a[10],x;
int *ptr;
ptr=&a[0]; /* ptr punta all'indirizzo di a[0] */
x=*ptr; /* x = contenuto di ptr (in questo caso, a[0]) */
A questo punto potremo incrementare ptr con successive istruzioni
++ptr
ma potremo anche avere
(ptr + i)
che e' equivalente ad a[i], con i=0,1,2,3...9 .
Quindi per raggiungere un elemento qualsiasi dell'array utilizzando un
puntatore, l'istruzione puo' essere:
ptr + i = a[i]
Attenzione: non c'e alcun limite di controllo per array e pointer, cosi' e'
facilmente possibile oltrepassare la memoria prevista per un
array e sovrascrivere altre cose.
Il C comunque e' molto piu' sottile nei propri collegamenti tra vettori e
puntatori.
Ad esempio e' possibile scrivere
ptr=a;
invece di
ptr=&a[0];
ed a[i] puo' essere scritto come
*(a+i)
cioe' &a[i] = a+i.
Inoltre si possono esprimere puntatori nel seguente modo
ptr[i] = *(ptr+i)
Va comunque ricordato che puntatori e vettori sono diversi:
- un puntatore e' una variabile, per cui possiamo scrivere:
ptr=a ed ptr++
- un array non e' una variabile quindi:
a=ptr ed a++ sono istruzioni non valide
Ora siamo in grado di comprendere in che maniera gli array vengono passati
alle funzioni. Quando un array e' passato ad una funzione, quello che viene
effettivamente passato e' la locazione in memoria del suo elemento iniziale.
Cosi':
strlen(s)=strlen(&s[0])
Questo e' il motivo per cui dichiariamo la funzione:
int strlen(char s[]);
Una dichiarazione equivalente e':
int strlen(char *s);
poiche' char s[]=char *s.
strlen() e' una funzione della standard library che ritorna la lunghezza di
una stringa.
Vediamo ora come possiamo scrivere una funzione:
int strlen(char *s)
{ char *p=s;
while (*p != '\0);
p++
return p-s;
}
Ora scriviamo una funzione per copiare una stringa in un'altra stringa.
strcpy() e' una funzione della standard library che compie questa operazione.
void strcpy(char *s, char *t)
{ while ((*s++ = *t++) != '\0);i }
In questo esempio vengono utilizzati puntatori ed assegnazioni per valore.
E' interessante notare l'utilizzo della frase "null" con while.