Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Puntatore
E’ una variabile che contiene l’indirizzo di
memoria di un oggetto (variabile o costante)
I puntatori Esempio
p è un puntatore e “punta” A55 12 x
alla variabile x che in
A54 ...
questo esempio ha indirizzo
Ver. 2.4 di memoria A55) A53 ...
int x=12; x:A55 A52 ...
12 A51 ...
p
A55 A50 A55 p
© 2010 - Claudio Fornaro - Corso di programmazione in C
3 4
Definizione Assegnazione
Sintassi Ad un puntatore si possono assegnare solo
tipo *nomeVariabile; indirizzi di memoria o il valore NULL che indica
che il puntatore non punta a nulla
Esempi
int *punt; La costante 0 in un contesto dove è atteso un
char x, *p, *q, y; puntatore (inizializzazione e assegnamento di
un puntatore, confronto con un puntatore)
x e y sono variabili di tipo char viene convertita in NULL dal compilatore
p e q sono variabili di tipo puntatore-a-char L’operatore di indirizzo ‘&’ (“ampersand”)
calcola l’indirizzo di memoria di una variabile
(si dice che ne restituisce il puntatore)
int *p = &x; inizializza p con l’indirizzo di x
p = &y; assegna a p l’indirizzo di y
5 6
Utilizzo Utilizzo
Si accede all’oggetto puntato da un puntatore Sia p sia *p sono L-value modificabili, ossia
per mezzo dell’operatore ‘*’ detto sono un “qualcosa” (variabile, elemento di
operatore di deriferimento (“dereference”) vettore, …) a cui si può assegnare un valore
o di indirezione (“indirection”) L’operatore ‘*’ ha priorità superiore a quella
int x=12, *p = &x; p “punta a” x degli operatori matematici
*p = 24; x ora vale 24 x = 6 * *p; equivale a: x = 6 * (*p);
*p += 6; x ora vale 30 Per visualizzare il valore di un puntatore si
p è il puntatore può utilizzare la direttiva %p in una printf
*p è l’oggetto puntato (qui è x)
Si noti che la sintassi per indicare l’oggetto
puntato e quella della definizione del puntatore
sono identiche: *p
7 8
11 12
p p
p+3 p+3
p punta a (contiene l'indirizzo di) vett E’ lecito sottrarre un valore N ad un puntatore
p+3 punta a (produce l'indir. di) vett[3] se l’elemento puntato risultante fa ancora parte
*(p+3) equivale a vett[3] del vettore (nell’esempio precedente p-1
punta a vett[0])
15 16
19 20
1a versione 2a versione
La stringa y viene copiata in x La stringa y viene copiata in x
char x[30], y[30], *t=x, *s=y; char x[30], y[30], *t=x, *s=y;
int i=0; int i=0;
gets(y);
while (s[i] != '\0') gets(y);
{ while ((t[i] = s[i]) != '\0')
t[i] = s[i]; i++;
i++; printf("%s\n", x);
} Il '\0' viene copiato nel ciclo stesso
t[i] = '\0';
printf("%s\n", x); Qui s e t vengono inutilmente usati come
Il '\0' viene copiato fuori dal ciclo semplici sinonimi di x e y, non come puntatori
Qui s e t vengono inutilmente usati come Nota: non si può scrivere t[i] = s[i++]
semplici sinonimi di x e y, non come puntatori nella condizione del while (side effect)
Copia di stringhe 23
Copia di stringhe 24
3a versione 4a versione
La stringa y viene copiata in x La stringa y viene copiata in x
char x[30], y[30], *t=x, *s=y; char x[30], y[30], *t=x, *s=y;
gets(y); gets(y);
while ( (*t = *s) != '\0') while (*t++ = *s++)
{ ;
t++; printf("%s\n", x);
s++;
Il '\0' viene copiato nel ciclo stesso
}
printf("%s\n", x); Nota: l‘istruzione nulla è più chiara se scritta
in una riga a sé stante
Il '\0' viene copiato nel ciclo stesso
Nota: != '\0' può essere omesso
25 26
27 28
Puntatori const 31
Puntatori const 32
35 36
Esercizi Esercizi
5. Scrivere un programma che data una stringa 8. Scrivere un programma che chieda N valori
in input dica se la stessa contiene almeno una (massimo 100), li collochi in un vettore e li
‘A’ tra i primi 10 caratteri. ordini in senso crescente (senza usare vettori
6. Si scriva un programma che chieda all’utente ausiliari).
2 stringhe e concateni la seconda alla fine 9. Scrivere un programma che verifichi se la
della prima, NON si usi la funzione strcat stringa data è composta di due parti uguali,
della libreria standard, si usino i puntatori e trascurando il carattere centrale se la
non la notazione vettoriale. Attenzione a lunghezza è dispari (es. “CiaoCiao”,
terminarla con il carattere ‘\0’. “CiaoXCiao”).
7. Si scriva un programma che chieda all’utente 10. Scrivere un programma che date 2 stringhe in
2 stringhe e indichi se la seconda è uguale input indichi quante volte la più corta è
alla parte terminale della prima. contenuta nella più lunga.
37 38
39 40
43 44
47 48
51 52