Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
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