18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

assegna al puntatore p l’indirizzo del primo elemento del vettore vett. Il vettore viene riempito<br />

con il primo ciclo, accedendo ai singoli elementi attraverso il puntatore p. Per mostrare che<br />

effettivamente gli elementi del vettore sono stati correttamente scritti, tali elementi vengono<br />

scritti a video accedendo al vettore attraverso il suo identificatore vett.<br />

Il C è pensato <strong>per</strong> essere molto vicino al processore e alle sue strutture; non dovrebbe <strong>per</strong>ciò<br />

stupire la scelta degli autori del linguaggio di rappresentare un vettore con l’indirizzo del suo<br />

primo elemento. Puntatori e vettori sono <strong>per</strong>ciò concetti intercambiabili e ad un puntatore si<br />

può applicare un indice tramite l’o<strong>per</strong>atore parentesi-quadre senza che questo provochi errori<br />

o messaggi di attenzione. Il nome di un vettore è diverso da un puntatore in quanto non gli<br />

può essere assegnato un nuovo valore: si tratta di un indirizzo costante istanziato all’atto della<br />

compilazione del programma.<br />

Ai puntatori possono essere sommati e sottratti numeri interi: il risultato della somma di<br />

un puntatore e di un numero intero n è il puntatore all’elemento numero n del vettore. Il<br />

numero intero non rappresenta cioè il numero di byte da aggiungere nell’indirizzo, ma il numero<br />

di elementi, il fattore di scala appropriato viene applicato dal compilatore in base al tipo di<br />

puntatore oggetto di o<strong>per</strong>azione aritmetica. È possibile quindi incrementare/decrementare un<br />

puntatore, come pure fare la differenza (ma non la somma) tra puntatori dello stesso tipo, e<br />

il risultato è un numero intero). L’aritmetica su puntatori generici (puntatori a void) con gcc<br />

usa 1 byte come dimensione dell’elemento puntato, mentre non è definita secondo lo standard<br />

del linguaggio. Il “puntatore nullo” vale zero e non è un puntatore valido; nelle funzioni che<br />

ritornano un puntatore è spesso ritornato come segnalazione di errore. La macro NULL vale 0,<br />

e 0 è confrontabile con qualunque puntatore.<br />

Gli o<strong>per</strong>atori più importanti <strong>per</strong> usare i puntatori sono “*” (si legge “il puntato da”) e “&”<br />

(“l’indirizzo di”).<br />

Esempi:<br />

int i, v[10], *p; /* un numero intero, un vettore e un puntatore:<br />

"è intero ogni elemento del vettore v, di dimensione 10"<br />

"è intero quello che è puntato da p" */<br />

p = v; /* assegno a p il valore di v, l’indirizzo del primo elemento */<br />

p = &v[0]; /* come sopra */<br />

p = &v[4]; /* assegno a p l’indirizzo del quinto elemento di v */<br />

p = v + 4; /* come sopra */<br />

p++; /* incremento p */<br />

i = p - v; /* assegno 5 a i (in conseguenza delle due righe precedenti) */<br />

Nell’esempio che segue, viene effettuato un ciclo fintanto che non viene incontrato un valore<br />

nullo nel vettore v. Il puntatore p viene utilizzato <strong>per</strong> scorrere il vettore, essendo inizializzato<br />

all’indirizzo del primo elemento del vettore stesso. Il ciclo termina quando il valore puntato<br />

da p, cioè *p, è nullo. Il ciclo calcola la somma di tutti i valori considerati, memorizzandola<br />

in sum. Si noti che deve esserci almeno un elemento di v che vale zero, altrimenti il puntatore<br />

assumerà valori non validi andando ad accedere aree di memoria poste oltre la fine del vettore. Il<br />

linguaggio non effettua alcun controllo implicito su puntatori e indici di vettori, quindi questo è<br />

un tipico errore logico dalle conseguenze spesso imprevedibili. Infatti tali conseguenze dipendono<br />

dal contenuto della memoria posta dopo quella allocata <strong>per</strong> il vettore v.<br />

sum = 0;<br />

for (p = v; *p; p++)<br />

sum += *p;<br />

90

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!