Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Pointer e pointer variable, uguale al gioco degli specchi?

    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!

  2. #2
    In indirizzo_x è memorizzato l' indirizzo della variabile x e attraverso il deference_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.

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    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.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    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!!

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Che problemi di da che ci possa essere un pointer to pointer to (??)?
    codice:
    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
    Ultima modifica di Scara95; 07-01-2015 a 10:21
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    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!

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Di nulla
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    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.
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    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.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    grazie mille ragazzi!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.