Linguaggio C per MSX
Rubrica a cura di Nicola Brogelli (Parte 4)
Puntatori
In questa dispensa accenneremo cosa sono i puntatori. Queste informazioni saranno utili per le dispense successive dove andremmo a parlare dell’aritmetica dei puntatori legata agli array, di come realizzare il passaggio di parametri per riferimento ecc.
Accenni ai puntatori
Dai tipi fondamentali che abbiamo incontrato nella prima dispenda si possono derivare altri tipi di dato. Per esempio da un tipo int possiamo derivare un puntatore a int e così via per tutti gli altri tipi. Ora ci possiamo chiedere che cosa è un puntatore. Possiamo dire che una variabile appartenente a questo tipo è un oggetto il cui valore è un indirizzo di memoria. Quindi un oggetto di tipo puntatore ha come valore l’indirizzo di un altro oggetto o di una funzione (in questa dispensa non tratteremo i puntatori a funzione).
La più semplice forma di dichiarazione di un puntatore è la seguente:
tipo variabile *nome_variabile
Nell’esempio seguente possiamo vedere la dichiarazione di variabili di tipo puntatore.
int *p;
double *d;
float *f;
Ad un puntatore possiamo assegnare dei valori, se gli assegniamo 0 o NULL, otterremo un puntatore nullo. Il puntatore nullo non si riferisce a nessun oggetto e quindi il tentativo di deferenziarlo porterà ad un errore a tempo di esecuzione. Oppure potremmo assegnare al puntatore l’indirizzo di memoria di una variabile. Questo è possibile tramite l’uso dell’operatore & (operatore di indirizzo). L’operatore & è unario e prefisso, restituisce l’indirizzo di memoria del suo operando. Nell‘ esempio seguente dichiariamo una variabile di tipo int e le assegniamo il valore 5, successivamente dichiariamo una variabile puntatore a int e contestualmente le assegniamo l’indirizzo di memoria di i.
int i = 5;
int *pi = &i;
Per accedere ad una variabile puntatore si utilizza l’operatore * (deferenziazione o indirezione). Anche questo operatore è unario e prefisso e restituisce il valore della variabile puntata dal puntatore.
L’esempio seguente stampa il valore della variabile i e cioè 5.
printf(“%d”, *pi);
In alcuni casi particolari potremmo voler specificare che un dato puntatore non deve essere usato per modificare l’oggetto a cui punta, questo potremmo ottenerlo tramite la parola chiave const
int i;
const int *pi = &i;
In seguito a questa dichiarazione tutte le istruzioni successive che tenteranno di cambiare il valore i usando il puntatore pi verranno segnalate come errore.
*pi = 5; // non lecito
Puntatori a void
Abbiamo detto che la dichiarazione di un puntatore specifica il tipo dell’oggetto riferito. In alcuni casi può essere utile che una variabile possa contenere puntatori a tipi di oggetti diversi. In questo caso la variabile viene definita come puntatore a void. Prima di essere deferenziato un puntatore a void deve essere convertito mediante un cast al tipo opportuno. Con un semplice esempio vediamo come un puntatore a void viene utilizzato per accedere prima a un numero intero e poi a un carattere.
int i;
int *pi = &i;
int c;
int *pc = &c;
void *vp;
vp = pi;
*(int*)vp = 3;
vp = pc;
*(char*)vp = ‘c’;
Per chi fosse interessato l’Associazione MSX Italia ha creato un gruppo di lavoro di Ricerca e sviluppo sulla programmazione C per MSX. Per maggiori info: associazioneMSXitalia@gmail.com




0 commenti