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:

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.