Lezione 7/ C I Puntatori

      Nessun commento su Lezione 7/ C I Puntatori

In questo capitolo tratteremo i puntatori che sono una delle caratteristiche più importanti del linguaggio C.

Per spiegare i puntatori partiamo da un livello macchina. Come sappiamo la memoria di un computer è suddivisa in byte, ognuno dei quali può memorizzare 8 bit di informazioni. Ogni byte possiede un indirizzo che lo contraddistingue dagli altri. Se abbiamo n byte, come già detto per gli array, gli indirizzi vanno da 0 a n-1. E’ qui che possiamo introdurre i puntatori, infatti gli indirizzi essendo numeri, possiamo salvarli in queste speciali variabili chiamate VARIABILI PUNTATORE.

Una variabile puntatore viene dichiarata come se fosse una normale variabile, ma il nome della variabile deve essere preceduto da un asterisco che è l’operatore di dereferenziazione:

int *a;

Questa dichiarazione stabilisce che a è un puntatore che può puntare ad altre variabili dello stesso tipo, ma potrebbe anche puntare ad altri puntatori. Ma questo è un discorso più avanzato che tratteremo in seguito.

Nel C abbiamo un operatore fatto apposta per i puntatori, che serve per trovare l’indirizzo di una variabile. Questo simbolo è: & o E commerciale.

Dichiarare un puntatore, alloca spazio per esso, ma la dichiarazione in se non lo fa puntare a nulla. dunque dobbiamo scrivere:

int i, *a;

a=&i;

Questo assegnamento fa si che p punti ad i. Ovvero l’indirizzo di i viene assegnato alla variabile i.

Stiamo attenti ad una cosa però: non applichiamo mai l’operatore asterisco ad una variabile puntatore non inizializzata, come:

int *a;

printf(“%d”,*a)

Il comportamento del programma sarà indefinito e molto probabilmente andrà in crash o avere altri effetti indesiderati.

Inoltre, ricordate, inizializzare variabili puntatore è pericoloso. Se per caso p dovesse contenere un indirizzo di memoria valido, il seguente assegnamento cercherà di modificare i dati a quell’indirizzo:

int *a;

*p=1;

Peggio ancora se la locazione modificata da questo assegnamento appartiene al sistema operativo: il programma andrà sicuramente in crash. Il compilatore emette segnali di warning, non trascurateli!

OPERATORE DI ASSEGNAMENTO

Il C consente di usare l’operatore di assegnamento per copiare i puntatori ammesso che ovviamente, siano dello stesso tipo. Esempio:

int a,b,*p,*q;

p=&a;  /*E’ un esempio di assegnamento di un puntatore. L’indirizzo di i viene copiato dentro p*/

oppure potremmo scrivere:

q=p;

ARITMETICA DEI PUNTATORI

In C i puntatori possono tranquillamente puntare ad elementi di un array. Infatti la relazione tra array e puntatori è molto stretta. Ad esempio, se abbiamo la seguente dichiarazione:

int a[20], *p;

possiamo fare in modo che p punti ad a[0] scrivendo: p=&a[0];

Adesso possiamo facilmente accedere ad a[0] tramite il nostro puntatore p. Infatti se volessimo memorizzare un numero, per esempio 10, all’interno di a[0] basterà scrivere:

*p=10;

Ma questo è solo l’inzio! Usando i puntatori e la loro aritmetica, possiamo effettuare tre operazioni fondamentali che sono:

SOMMARE UN INTERO AD UN PUNTATORE

SOTTRARRE DA UN PUNTATORE UN INTERO

SOTTRARRE DA UN PUNTATORE UN ALTRO PUNTATORE

Per gli esempi dichiariamo delle variabili:

int a[20], *p, *q, i;

SOMMARE UN INTERO AD UN PUNTATORE: Sommare un intero j a un puntatore p restituisce un puntatore all’elemento che si trova j posizioni dopo dell’elemento puntato originariamente da p. Più precisamentem se p punta all’elemento a[i] allora p+j punta all’elemento a[i+j].

SOTTRARRE UN INTERO DA UN PUNTATORE: Se p punta all’elemento a[i] di un vettore, allora p-j punta ad a[i-j].

SOTTRARRE DA UN PUNTATORE UN ALTRO PUNTATORE: Quando si effettua questa operazione, avremo come risultato la distanza fra i due puntatori. Quindi se p punta ad a[i] e q punta ad a[j] allora p-j è uguale a i-j.