Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 30

Discussione: [C]Puntatori

  1. #11
    La & serve per sapere a che posizione in memoria si trova la variabile in questione, ossia il suo indirizzo. Per sapere le dimensioni di una variabile c'è l'operatore sizeof.
    in parole povere:
    & ti dice dove si trova?
    * ti dice il contenuto della variabile in questione?

    La 3 è concettualmente sbagliata, perché si cerca di assegnare ad un intero un puntatore, il che non ha senso. (in alcuni casi si fa, ma per motivi "di forza maggiore")
    In ogni caso, x assumerebbe il valore corrispondente al suo indirizzo in memoria. Supponendo, come suppone l'esempio, che x si trovi alla locazione di memoria 100, allora x assumerà il valore 100. Il valore del puntatore è l'indirizzo a cui punta, non è ciò che in esso è contenuto, proprio per questo è necessario usare l'operatore * per ottenere il valore che si trova nella zona di memoria a cui il puntatore punta.
    faccio un esempio:
    se x si trova nella posizione 1 della memoria il puntatore assume 1 come valore della memoria ma non come valore effettivo ( quello rimane 10) giusto?
    Per inciso, il termine "script" si usa solo per alcuni linguaggi interpretati, in C si parla di "file sorgente" (o di applicazione compilata, se si parla del binario dato in output dal compilatore).
    si è stato uno sbaglio hai ragione
    codice:
    *pointer=y;
    la memoria a cui punta pointer (e quindi di fatto x) assumerà il valore che ha y.
    ok quindi pointer cosi perdera sia la memoria che il valore di x? e prendera quella di y, quindi x e y condivideranno la stassa memoria e valore effettivo insieme al poiter?
    Se tu invece vuoi fare sì che il puntatore punti a y, dovrai fare:
    codice:
    pointer=&y;
    in questo caso succede che pointer si trasferisce sulla memoria di y senza cambiargli il valore effettivo?
    Non devi fare confusione tra il puntatore e ciò a cui punta. Come detto, il valore di una variabile puntatore è l'indirizzo a cui punta, non ciò che si trova a quell'indirizzo, per cui se assegni ad un puntatore qualcosa (senza specificare l'operatore *), vai a modificare l'indirizzo a cui punta. Al contrario, se applichi l'operatore * ad un puntatore stai andando ad operare sul valore a cui il puntatore punta.
    per esempio
    int *pointer;
    pointer = &x; /*qui pointer entra nello stesso spazio di memoria di x ma non ne prende il contenuto */
    y = *pointer; /*invece qui non prende l'indirizzo memoria ma solo il contenuto?*/



    è normale che non riesco a capire tutto il procedimento? succede a tutti quando inziano?


    un altra cosa, solitamente per cosa vengono usati i pointer in forma pratica?

    grazie per la pazienza

  2. #12
    Originariamente inviato da gennahouse
    in parole povere:
    & ti dice dove si trova?
    * ti dice il contenuto della variabile in questione?
    & ti dice dove si trova una variabile, di qualunque variabile si tratti; * ti dice il contenuto della memoria a cui punta un puntatore, infatti si applica solo ai puntatori
    faccio un esempio:
    se x si trova nella posizione 1 della memoria il puntatore assume 1 come valore della memoria ma non come valore effettivo ( quello rimane 10) giusto?
    Il "valore effettivo" di un puntatore è l'indirizzo di memoria a cui punta.
    ok quindi pointer cosi perdera sia la memoria che il valore di x? e prendera quella di y, quindi x e y condivideranno la stassa memoria e valore effettivo insieme al poiter?
    No. Il valore di pointer (ossia l'indirizzo a cui punta) non è toccato in tutto questo processo. Semplicemente nella memoria a cui punta (che poi è il valore di x) viene copiato il valore di y.
    in questo caso succede che pointer si trasferisce sulla memoria di y senza cambiargli il valore effettivo?
    Sì, anche se l'hai detto in maniera un po' intricata.
    per esempio
    int *pointer;
    pointer = &x; /*qui pointer entra nello stesso spazio di memoria di x ma non ne prende il contenuto */
    y = *pointer; /*invece qui non prende l'indirizzo memoria ma solo il contenuto?*/
    Sì, anche se "entra nello stesso spazio di memoria" non ha molto senso. Semplicemente, a pointer viene assegnato l'indirizzo di x.
    è normale che non riesco a capire tutto il procedimento? succede a tutti quando inziano?
    Sì, anche se ti vedo particolarmente confuso.
    un altra cosa, solitamente per cosa vengono usati i pointer in forma pratica?
    Per gestire gli array, le stringhe (che di fatto sono array), per gestire la memoria allocata dinamicamente per passare oggetti per riferimento, in modo da consentire che siano modificati altrove o in modo da evitare di effettuare continuamente copie e per mille altri utilizzi.

    Comunque, i puntatori non sono nulla di magico, e in realtà non sono neanche complicati. Vedila così:
    Una variabile è uno spazio di memoria "riservato", in cui ci si memorizza qualcosa, di fatto numeri (interi, in virgola mobile, caratteri => che poi sono soltanto dei numeri "speciali").
    Un puntatore è anch'esso una variabile, solo che il numero che ci si memorizza dentro non è un generico numero, ma un indirizzo di memoria (che, effettivamente, è un numero intero); questo consente di utilizzarlo per "puntare" ad altri spazi di memoria.
    I valori sensati che può assumere un puntatore sono naturalmente solo degli indirizzi di memoria validi; come si possono ottenere tali indirizzi? Con l'operatore &, che restituisce l'indirizzo di memoria della variabile a cui è applicato.
    Ok, ma ora che ho un indirizzo di memoria memorizzato in una variabile di tipo puntatore, cosa ci posso fare? Ovviamente si può andare a vedere cosa c'è a questo indirizzo di memoria, ed eventualmente modificarlo. Questo si fa con l'operatore *, che consente di "tirare fuori" dall'indirizzo ciò a cui punta.

    Quindi, tieni a mente che il valore contenuto in un puntatore è l'indirizzo a cui punta; quando tu operi su un puntatore senza usare l'operatore *, significa che tu stai lavorando su tale valore; se tu assegni ad un puntatore un altro indirizzo, semplicemente cambi l'indirizzo memorizzato nel puntatore, e quindi ciò a cui punta.
    Quando invece operi su un puntatore usando l'operatore *, stai andando a leggere/modificare il valore che sta là dove dice l'indirizzo memorizzato nel puntatore.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #13
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    codice:
    int a; /* variabile comune */
    int *p; /* variabile puntatore */
    
    a = 10;
    
    p = &a; /* il puntatore ha come valore ( o punta) l'indirizzo di memoria della variabile a */;
    
    *p /= 2; /* il valore puntato da p (in questo caso il valore di a) viene diviso per 2, quindi ora a = 5 */
    Non é molto difficile da capire:
    Indirizzo di memoria variabile "a" [0xbfa626d0] --> Valore contenuto = 10;
    Indirizzo di memoria del puntatore p [0xbfa626cc] --> Valore contenuto nell' i. di mem. p = 0xbfa626d0

  4. #14
    FOrse ora ho capito (forse)

    allora facciamo un esempio:

    1) int a=3;
    2) int *x;
    3) x=&a;
    4) *x=4;

    1) dichiaro una variabile intera
    2) dichiaro un puntatore
    3) indago dove si trova a (cieo acquisisto l'indirizzo della memoria)
    4) x è diventato il "manager" di a quindi in questo caso cambio il valore di a da 3 a 4.



    se ho capito bene (e spero di si ) un puntatore non è altro che una sorta di controfigura (come per gli attori) mi spiego meglio, lui prende l'indirizzo di memoria dove si trova un altra variabile, la memorizza e dopo la puoi usare come se fosse lei per assegnarli un altro valore.


    Però io dico, non è piu facile fare
    a = 4; ?

  5. #15
    Originariamente inviato da gennahouse [...]
    Più o meno è corretto.
    Però io dico, non è piu facile fare
    a = 4; ?
    In questo caso sì. Ma appunto, senza puntatori come implementeresti una funzione che possa modificare delle variabili dichiarate altrove, come fa, appunto, una funzione di swap?
    Inoltre i puntatori servono per tutte le altre cose che ho citato sopra; andando avanti nello studio del C vedrai che i puntatori sono fondamentali.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #16
    Si l'ho letto praticamente da pertutto che sono fondamentali per questo mi sono preso una pausa per capirli bene...

    per esempio io potrei usare un puntatore come variabile globale e usare la variabile a cui la punto in due funzioni diverse? si potrebbe fare cosi vero? cioe sarebbe l'unico modo senza che vada a interferire con altre funzioni, perche se usassi una variabile statica poi andrebbe ad incidere anche con altre funzioni...

    questo è giusto?

    purtroppo le funzioni swap non le ho ancora studiate quindi non posso seguire il ragionamento



    tuttavia c'è una cosa che mi sfugge:

    CODICE:
    int *pointer; /* dichiara pointer come un puntatore a int */
    int x=1,y=2;

    (1) pointer= &x; /* assegna a pointer l'indirizzo di x */
    (2) y=*pointer; /* assegna a y il contenuto di pointer */
    (3) x=pointer /* assegna ad x l'indirizzo contenuto in pointer */
    (4) *pointer=3; /* assegna al contenuto di pointer il valore 3 */

    SPIEGAZIONE:
    L'istruzione (1) fa si che pointer punti alla locazione di memoria 100
    (quella di x).
    La (2) fa si che y assuma valore 1 (il valore di x).
    La (3) fa si che x assuma valore 100 (cioe' il valore di pointer).
    La (4) fa si che il valore del contenuto di pointer sia 3 (quindi x=3).


    RIFLESSIONI:
    1) qui pointer dovrebbe ereditare da x solo l'indirizzo memoria e non il valore effittivo oppure no?


    Simo, ma questo cosa sarebbe?

    Indirizzo di memoria variabile "a" [0xbfa626d0] --> Valore contenuto = 10;
    Indirizzo di memoria del puntatore p [0xbfa626cc] --> Valore contenuto nell' i. di mem. p = 0xbfa626d0
    quelle stringhe li sono un linguaggio?

  7. #17
    Originariamente inviato da gennahouse
    Si l'ho letto praticamente da pertutto che sono fondamentali per questo mi sono preso una pausa per capirli bene...

    per esempio io potrei usare un puntatore come variabile globale e usare la variabile a cui la punto in due funzioni diverse? si potrebbe fare cosi vero? cioe sarebbe l'unico modo senza che vada a interferire con altre funzioni, perche se usassi una variabile statica poi andrebbe ad incidere anche con altre funzioni...
    In generale l'uso dei global sarebbe da evitare, comunque consentono di fare cose del genere.
    purtroppo le funzioni swap non le ho ancora studiate quindi non posso seguire il ragionamento
    Nulla di che, intendo semplicemente una funzione che scambia il valore di due variabili (usata frequentemente, ad esempio, negli algoritmi di ordinamento):
    codice:
    void swap(int * a, int * b)
    {
        int temp=*a;
        *a=*b;
        *b=temp;
    }
    1) qui pointer dovrebbe ereditare da x solo l'indirizzo memoria e non il valore effittivo oppure no?
    In pointer viene copiato solo l'indirizzo di memoria, infatti. Il fatto che poi uno acceda al contenuto di x è conseguenza del fatto che tramite l'operatore * posso andare a vedere cosa c'è a quell'indirizzo di memoria.
    Simo, ma questo cosa sarebbe?
    quelle stringhe li sono un linguaggio?
    Le stringhe che iniziano con 0x sono valori in esadecimale, e in quel caso sono gli indirizzi di memoria; gli indirizzi di memoria di solito si indicano in esadecimale.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #18
    Nulla di che, intendo semplicemente una funzione che scambia il valore di due variabili (usata frequentemente, ad esempio, negli algoritmi di ordinamento):
    codice:
    void swap(int * a, int * b)
    {
        int temp=*a;
        *a=*b;
        *b=temp;
    }
    quindivece succede che a diventa b e b diventa a?
    però come è possibile fare *a=*b; se *b non è un pointer?

    In pointer viene copiato solo l'indirizzo di memoria, infatti. Il fatto che poi uno acceda al contenuto di x è conseguenza del fatto che tramite l'operatore * posso andare a vedere cosa c'è a quell'indirizzo di memoria.
    è quello che dico io, teoricamente pinter ha solo l'indirizzo di x e non il valore effittivo.
    però nella riga dopo dice che y diventa 1 perndendo il valore effettivo di x


    (1) pointer= &x; /* assegna a pointer l'indirizzo di x */
    (2) y=*pointer; /* assegna a y il contenuto di pointer */
    (3) x=pointer /* assegna ad x l'indirizzo contenuto in pointer */
    (4) *pointer=3; /* assegna al contenuto di pointer il valore 3 */

    Le stringhe che iniziano con 0x sono valori in esadecimale, e in quel caso sono gli indirizzi di memoria; gli indirizzi di memoria di solito si indicano in esadecimale.
    ah bene, però credo che questo dovro vederlo piu avanti...

  9. #19
    Originariamente inviato da gennahouse
    quindivece succede che a diventa b e b diventa a?
    però come è possibile fare *a=*b; se *b non è un pointer?
    Sia a che b sono puntatori, guarda la loro dichiarazione come parametri.
    è quello che dico io, teoricamente pinter ha solo l'indirizzo di x e non il valore effittivo.
    però nella riga dopo dice che y diventa 1 perndendo il valore effettivo di x
    Nella prima riga a pointer viene assegnato l'indirizzo di x; nella seconda, si va a vedere cosa c'è all'indirizzo appena memorizzato in pointer (e ovviamente c'è il valore effettivo di x) e lo si copia in y.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #20
    Originariamente inviato da MItaly
    Sia a che b sono puntatori, guarda la loro dichiarazione come parametri.
    a bene, quindi si puo definire anche cosi sul momento.
    Nella prima riga a pointer viene assegnato l'indirizzo di x; nella seconda, si va a vedere cosa c'è all'indirizzo appena memorizzato in pointer (e ovviamente c'è il valore effettivo di x) e lo si copia in y. [/QUOTE]io credevo che cosi:

    pointer = &x;

    si otteneva solo l'indirizzo della memoria di x, ma invece ottieni sia l'indirizzo che il valore effettivo?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.