Lezione 13: Puntatori

[17/05/2011]

Puntatori

int *p = NULL;  // dichiarazione puntatore
int x = 10;     // una variabile intera

// creazione di un riferimento ad x

p = &x;           // & operatore address of

// posso usare *p al posto di x in ogni espressione.

assert(x+10 == *p+10);
printf("%d\n",*p);

// *p è un alias di x, posso cambiare x senza nominarlo

*p = 15;
assert(x == 15);

/*
posso passare un puntatore ad una funzione
che può cambiare il valore delle variabili locali
*/
int y = x;

square(&x);

assert(x == y*y);

// Allocazione dinamica della memoria
p = (int *) malloc(sizeof(int));

// uso *p coame una variabile intera quando finisco:

free(p);

// Allocazione di un vettore:

double *v = (double *) malloc(sizeof(double)*10);

// Un puntatore ad una sequenza di valori dello stesso tipo
// non è altro che un array monodimensionale, infatti:
// *(v+i) == v[i] perche: v = &v[0], quindi v+i è un puntatore
// all'i-esimo elemento (vedi artimetica dei puntatori sul libro)
// e *(v+i) è quindi il valore contenuto, quindi uguale a v[i].

// aritmetica dei puntatori:
double *w = v+5;

// w punta al sesto elemento di v quindi w[0]==v[5],..w[4]==v[9].

 for (int i=0; i<10; i++) v[i] = 0;

// siccome w punta al 5 elemento di v allora:
assert(v[5] == w[0]);

w[4] = 10;
assert(v[9] == 10);

Lascia un commento