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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

È un errore fare assegnamenti tra puntatori di tipo diverso, così come è un errore fare o<strong>per</strong>azioni<br />

aritmetiche tra puntatori di tipo diverso. È comunque possibile convertire un puntatore da un<br />

tipo ad un’altro, ma anche un puntatore in numero intero e viceversa; queste conversioni non<br />

provocano la generazione di codice macchina, <strong>per</strong>ché comunque nel processore i puntatori sono<br />

rappresentati da numeri interi, ma sono necessarie <strong>per</strong> la pulizia semantica del codice sorgente.<br />

È sempre consentito l’assegnamento di un puntatore-a-void a qualunque altro tipo di puntatore,<br />

come pure l’assegnamento di qualunque puntatore ad un puntatore-a-void. Questo <strong>per</strong>ché il<br />

tipo “void *” è quello che normalmente si usa <strong>per</strong> gestire indirizzi generici di memoria, o<strong>per</strong>azione<br />

comunissima nei sistemi o<strong>per</strong>ativi e nelle librerie di sistema.<br />

Se sono state fatte le seguenti dichiarazioni e istruzioni:<br />

int vet[100];<br />

int *p, *q;<br />

int x, y, z, i;<br />

p = &vet[0];<br />

le seguenti istruzioni sono equivalenti:<br />

x = vet[0]; x = *p; x = *vet;<br />

y = vet[i]; y = *(p+i); y = *(vet + i);<br />

vet[i] = z; *(p+i) = z; *(vet + i) = z;<br />

q = &vet[0]; q = p; q = vet;<br />

8.2 L’o<strong>per</strong>atore sizeof<br />

L’o<strong>per</strong>atore sizeof, applicato ad un tipo, ad un nome di variabile o ad un’espressione, ritorna<br />

la dimensione in byte dell’oggetto indicato. Tale calcolo viene effettuato in compilazione in base<br />

al tipo di dato che viene passato a sizeof. Se incremento un puntatore p, il suo valore numerico<br />

(indirizzo in memoria in byte) viene incrementato di sizeof(*p).<br />

Esempio:<br />

int i, v[10], *p; /* le stesse variabili di prima */<br />

i = sizeof(int); /* normalmente 4, ma può essere 8, oppure 2 */<br />

i = sizeof(i); /* come sopra */<br />

i = sizeof(v[0]); /* come sopra */<br />

i = sizeof(*p); /* come sopra */<br />

i = sizeof(p); /* 4 (dimensione del puntatore), oppure 8 */<br />

i = sizeof(v); /* 40, oppure 80, oppure 20 */<br />

i = sizeof(v)/sizeof(*v); /* 10: il numero di elementi nel vettore v */<br />

#define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x)) /* una comoda macro */<br />

8.3 Le stringhe<br />

Una stringa costante è una sequenza di 0 o più caratteri racchiusi fra doppi apici. Per esempio:<br />

"Questa e‘ una stringa"<br />

"Le due stringhe in fase di compilazione"<br />

" saranno concatenate"<br />

91

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

Saved successfully!

Ooh no, something went wrong!