// 3.2: Puntatori
#include <iostream>
using namespace std;
int main() {
int a(10);
int *b;
int *c;
cout << a << endl;
b = &a; // adesso b punta ad a
cout << *b << endl;
// accedere a *c, porterebbe un errore, poiche' c non e' stato
// inizializzato (contiene dati casuali)
c = NULL;
// per NULL si intende il puntatore 0x0, ovvero allo 0. NULL e' usato
// per riportare appunto che il puntatore e' vuoto.
// una cast implicita che il compilatore assume, e' che ogni array
// se invocato per nome e' implicitamente convertito a puntatore (e
// viceversa). Per esempio
int array[] = { 9, 8, 7, 6 };
// per ottenere il primo elemento (9), potremmo usare sia
// array[0] (indice nell'array)
// oppure assumere che array sia implicitamente convertito a
// &array[0]
// e quindi utilizzare
// *array
// L'aritmetica dei puntatori ci permette di eseguire, data la sintassi
// pointer + n
// dove n appartiene a Z
// uno spostamento in memoria pari alla grandezza del tipo di pointer
// per n. Ad esempio:
int *ptr1, *ptr2;
ptr1 = &array[0]; // punta al primo elemento nell'array
ptr2 = &array[2]; // punta al terzo elemento nell'array
int diff = (unsigned)ptr2 - (unsigned)ptr1; // diff, che e' un intero, e' uguale a 8
cout << diff << endl;
}