Download yaC-Primer - Pil group

Transcript
yaC-Primer: Puntatori
(Rev. 2.1.2)
∗ uno_p = 8 ;
/* cambia valore a var */
printf ( "2./ Valori : var = %d -- * uno_p = %d -- *due_p = %d\n" ,
var , ∗ uno_p , ∗ due_p ) ;
∗ due_p = 9 ;
/* cambia valore a var */
printf ( "3./ Valori : var = %d -- * uno_p = %d -- *due_p = %d\n" ,
var , ∗ uno_p , ∗ due_p ) ;
return 0 ;
}
Quando il programma viene eseguito si ha il seguente output:
1 . / Valori : var = 7 −− ∗ uno_p = 7 −− ∗ due_p = 7
2 . / Valori : var = 8 −− ∗ uno_p = 8 −− ∗ due_p = 8
3 . / Valori : var = 9 −− ∗ uno_p = 9 −− ∗ due_p = 9
da cui si vede chiaramente che sia *uno p che *due p fornisono il valore della variabile var.
I puntatori sono classificati come tipi interi, dopotutto contengono indirizzi di memoria, tuttavia le loro dimensioni dipendono da come viene gestita ed indirizzata la memoria con il
risultato che le dimensioni possono variare da un sistema all’altro. Inoltre su uno stesso
sistema le dimensioni dei puntatori possono differire a seconda del tipo di oggetto a cui puntano. Ad esempio i puntatori ad oggetti di tipo dati, come variabili o arrays, possono essere
più corti o più lunghi dei puntatori a tipo funzione. Il linguaggio C non richiede che vi sia
necessariamente una relazione tra le dimensioni dei puntatori e quella dei tipi interi anche
se usualmente si assume che le dimensioni del tipo long siano almeno pari a quelle del tipo
puntatore, cosa che usualmente è. Lo Standard C99 introduce i tipi intptr t e uintptr t
definiti nel file di header inttypes.h di dimensioni sufficienti a contenere sia un tipo intero
che un tipo puntatore.
2.24.4. Puntatori a tipo array
La dichiarazione di un puntatore ad un oggetto può richiedere l’uso delle parentesi “()”
per la corretta interpretazione della dichiarazione anche se queste non sono necessarie nella
dichiarazione dell’oggetto. Questo è il caso ad esempio dei puntatori ad arrays. Consideriamo
infatti la seguente dichiarazione di un array di 5 elementi di tipo int
int a [ 5 ] ;
La regola dice che per dichiarare un puntatore ad array di 5 elementi di tipo int bisogna
aggiungere l’operatore di dereferenza “*” prima dell’identificatore:
int ∗p [ 5 ] ;
Tuttavia l’operatore di indice “[]” ha un livello di precedenza più alto dell’operatore di
dereferenza “*” di conseguenza la dichiarazione viene interpretata come la dichiarazione di
un array di 5 elementi di tipo int *. In altre parole l’identificatore p viene associato ad un
225