PDA

Visualizza la versione completa : Pointer e pointer variable, uguale al gioco degli specchi?


zoc
06-01-2015, 19:28
Ciao a tutti,

non riesco a capire bene una cosa.

int x = 5;
printf("il mio indirizzo %p\n", &x);

è tutto chiaro, in &x abbiamo l'indirizzo della variabile ( tipo 0x7fff578d2c38 ).

Se poi facciamo così

int *indirizzo_x = &x;

in *indirizzo_x ( detto appunto pointer variable ) abbiamo memorizzato il contenuto dell'indirizzo di memoria (che ora è 5 ) o l'indirizzo stesso ( 0x7fff578d2c38 )?

e inoltre, dal momento che abbiamo memorizzato qualcosa, non ci sarà anche per *indirizzo_x il corrispettivo indirizzo di memorizzazione? dove è stato memorizzato *indirizzo_x?

grazie mille!

lovesemiramide
06-01-2015, 19:53
In indirizzo_x è memorizzato l' indirizzo della variabile x e attraverso il deference_operator (http://en.wikipedia.org/wiki/Dereference_operator) si può accedere all' area di memoria a cui "punta".
Anche i puntatori hanno un indirizzo di memoria proprio come tutte le altre variabili, infatti è possibile definire puntatori a puntatori.

Ad ogni modo ti consiglio di rileggere più attentamente il manuale che stai seguendo perché i puntatori sono alla base del C.

Scara95
06-01-2015, 20:32
x e *indirizzo_x sono totalmente equivalenti poiché indirizzo_x = &x (contiene l'indirizzo di x) e * giunge all'area di memoria indicata dall'indirizzo.

Tuttavia poiché a indirizzo_x puoi assegnare un indirizzo a tua scelta, in un momento diverso del programma x e *indirizzo_x potrebbero non essere più equivalenti.

zoc
07-01-2015, 06:19
Grazie Scara e Lovesemirande,
ma il concetto che non riesco a capire è che se c'è un indirizzo per una pointer variable (&pointer_variable), allora ci sarà un pointer del pointer e si finisce nel tunnel del infinito potenziale!!

Scara95
07-01-2015, 10:17
Che problemi di da che ci possa essere un pointer to pointer to (??)?

int x;
int *px = &x;
int **ppx= &px;
Dopo questo
ppx contiene l'indirizzo di px => *ppx equivale px
px contiene l'indirizzo di x => *px equivale x

ora, per la prima equivalenza, **ppx equivale x

Puoi andare avanti fin che vuoi ad aggiungere puntatori, ma ciò non ti deve tingere minimamente, il concetto rimane esattamente lo stesso:

hai un int puoi costruire un pointer to (int)
hai un pointer to int puoi costruire un pointer to (pointer to int)
hai un pointer to pointer to int puoi costruire un pointer to (pointer to pointer to int)
hai un ... puoi costruire un pointer to (...)
N.B. le parentesi sono state messe per chiarezza ma non sono necessarie

zoc
07-01-2015, 13:46
eheheh..... non lo so venivo tirato in mezzo in un vortice che mi portava all'infinito fino all'esaurimento di tutta la memoria disponibile!!
grazie mille per le spiegazioni!

Scara95
09-01-2015, 12:05
Di nulla :ciauz:

infinitejustice
10-01-2015, 01:39
Spulciando tra i miei appunti di Programmazione (copia/incolla dal file .doc del 2003!):

Dati:
unsigned x = 5, *myPointer = &x;

L'indirizzo di memoria di x è esprimibile in questi modi:
printf("\n%X", &x);
printf("\n%X", myPointer);
printf("\n%X", *&myPointer);
printf("\n%X", &*myPointer);

Il valore di x si esprime cosi:
printf("\n%d", x);
printf("\n%d", *myPointer);

Così si modifica x:
x = y;
*myPointer = y;


Che significato ha l’espressione **myPointer?
Nessuno. *punt esprime il valore memorizzato all’indirizzo puntato. Applicare una indirezione a tale valore non ha senso perchè il contenuto di x non è un indirizzo.

E l’espressione *x?
La risposta è uguale alla precedente. Scrivere *x comporta lo stesso errore che scrivere **punt.
Il contenuto di x non è un indirizzo.

Cosa restituisce &&x?
Restituisce un errore in compilazione. Infatti &x rappresenza l’indirizzo, ma che senso ha parlare dell’indirizzo di un indirizzo?

E l’espressione &&punt?
Anche questa è un’espressione incorretta. Un puntatore è sempre una variabile, quindi il discorso è lo stesso appena fatto per &&x.

Cosa accade se si esegue punt=0x24A6?
Si assegna un nuovo indirizzo di memoria a *punt, il quale ora punterà a ciò che si trova a quell’indirizzo e non più a x.

E se si esegue &punt = 0xAF2B?
Si ottiene un errore. Infatti l’indirizzo di punt non può essere modificato a mano, in quanto stabilito dal compilatore. E’ possibile solo stabilire a quale indirizzo punta.

Scara95
10-01-2015, 10:24
A dire il vero x è esprimibile anche come:
*&x
**&&x
...
*&*&x
...
**&myPointer
***&&myPointer
...
**&*&myPointer
...
*&*myPointer
**&&*myPointer
...
*&*&*myPointer
...

Insomma infinite combinazioni, e lo stesso vale per myPointer.
Mettere in catena *& non ha nessun senso perché si elidono.
Nel caso di &* invece il discorso è più complesso perché bisogna considerare anche la validità del puntatore. Ad ogni modo, se si tratta di un puntatore valido si elidono.

zoc
12-01-2015, 06:13
grazie mille ragazzi!

Loading