Un puntatore ad array è comunemente usato nelle stringhe, ovvero negli array di caratteri: quando si parla di stringhe, si parla quindi di puntatore ad array di caratteri.
//tipica stringa
char s[81] = "Stringa di caratteri";
Di norma in C, quando si usa una stringa si genera un puntatore alla stringa stessa (all’elemento con indice 0 dell’array), senza il bisogno di definirne il puntatore. Fare una cosa del tipo scanf(" %s", s);
fa capire che non è necessario usare il simbolo &
prima di s per identificare l’indirizzo dell’array (cosa che normalemente si fa quando si usa scanf per esempio con gli interi); questo perchè usare solo s
è come usare &s[0]
, ovvero l’indirizzo del primo elemento dell’array.
┌ s equivale ad &s[0]
│
[i] 0 1 2 3 4 5 6 7 8 ... 20
│ │ │ │ │ │ │ │ │ │
s{ S,t,r,i,n,g,a, ,d,i, ,c,a,r,a,t,t,e,r,i }
Essendo s
equivalente ad &s[0]
, si verifica che s
è anche un puntore all’array s[]
.
Ora è bene distinguere un comportamento tra “puntatori a caratteri” ed “array di caratteri”:
//assegnamento valido
char *text_ptr; //puntatore a caratteri
text_ptr = "Una stringa"; //assegno al puntatore un array di char
//assegnamento NON valido
char text[80]; //array di caratteri
text = "Non valido";
Un modo per inizializzare un array di caratteri è inizializzare l’array al momento della sua dichiarazione, come nel seguente modo:
//dichiaro e inizializzo array di caratteri
char text[80] = "Valido";
Altro modo è inizializzare un array di caratteri via prompt:
//inizializzo array tramite funzione scanf()
char text[81];
printf("Digita la stringa:\n");
scanf(" %s", text );
//inizializzo array tramite funzione getchar()
char text[81];
printf("Digita la stringa:\n");
int i = 0;
do{
s[i++] = getchar();
}while( s[i - 1] != '\n' );
s[i - 1] = '\0'; //tipicamente una stringa termina con valore nullo
Ricorda. L’istruzione s[i++] = getchar();
prima assegna a s
il valore restituito da getchar()
e poi incrementa l’indice i
.