Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 30

Discussione: [C]Puntatori

  1. #1

    [C]Puntatori

    Ciao a tutti, nel libro che sto leggendo non riesco a capire i puntatori.

    come nel esempio:

    codice:
    int a=3; // Variabile 
    int *x; // ''Puntatore'' ad una variabile di tipo int 
    x=&a; // Il puntatore ''x'' contiene l'indirizzo della variabile ''a'' 
    *x=4; // In questo modo modifico il contenuto del valore puntato
     // da x, quindi modifico indirettamente il valore di a
    non capisco bene a cosa serve *, da quanto ho capito serve per scrivere uno spazio nella memoria ram giusto?
    mentre da quello che ho capito & serve per sapere dove è salvato un dato nella memoria, diciamo per recuperarlo.

    fino a qui è giusto?

    Non capisco l'esempio, io lo vedo cosi,
    1 dichiara variabile
    2 crea una variabile con il puntatore e quindi viene salvata sulla memoria ram ( invece a non è salvata in nessuna memora in questo punto del codice?)
    3 questo passaggio non lo capisco molto bene, da quello che ho capito a viene trasferita nello stesso spazio di memoria di x.
    4 quindi se modifico x che è il puntatore modifico anche a?


    Qualcuno potrebbe spiegarmi bene i puntatori? non riesco proprio a capire il funzionamento, è stata la parte piu difficile fino ad ora.

    Grazie per l'attenzione

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    L'asterisco dopo essere stata già dichiarata la variabile puntatore si mette per fare riferimento alla variabile o a quello che punta.. L'operatore & si utilizza per riferirsi all' indirizzo di memoria..
    codice:
    int a = 5, *b = &a;
    
    *b = 8; /*a = 8*/
    Comunque è già spiegato nel tuo esempio
    Un puntatore può avere come valore l'indirizzo di memoria di un' altra variabile (ossia punta ad essa).
    codice:
    #include <stdio.h>
    
    int main()
    {
    	int a = 5, *b = &a;
    	
    	printf("a @\t%p --> %d\n", &a, a);
    	printf("b =\t%p --> %d\n", b, *b);
    	return 0;
    }

  3. #3
    Ciao Simo grazie per la risposta, però ancora non riesco a capire...
    Se noti il primo post ho fatto 1000 domande proprio perche non riesco a capire a cosa servono.
    cioe so che è la cosa piu difficile da capire nel C, e perche questo mi piacerebbe se qualcuno mi dica prima:
    1 a cosa servono i puntatori.
    2 come i usano i puntatori.


    Sono messo malissimo con questo argomento... Non riesco proprio a capirlo.

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da gennahouse
    cioe so che è la cosa piu difficile da capire nel C, e perche questo mi piacerebbe se qualcuno mi dica prima:
    1 a cosa servono i puntatori.
    2 come i usano i puntatori.
    Prova a usare questa funzione per scambiare tra di loro i valori di due variabili, vedrai che non funzierà:
    codice:
    void swap(int x, int y) {
       int temp = x;
       x = y;
       y = temp;
    }
    
    ...
    ...
    
    int a = 10, b = 5;
    swap(a, b);
    printf("a = %d, b = %d", a, b); // stampa "a = 10, b = 5"
    Prova ora quest'altra versione:
    codice:
    void swap(int *x, int *y) {
       int temp = *x;
       *x = *y;
       *y = temp;
    }
    
    ...
    ...
    
    int a = 10, b = 5;
    swap(&a, &b);
    printf("a = %d, b = %d", a, b); // stampa "a = 5, b = 10"
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Ciao ho provato gli esempi, ho visto che se non usi i puntatori non funziona.

    Però, per quale motivo succede questo?

  6. #6
    Perché in C i parametri delle funzioni sono passati per valore, ossia quando viene chiamata la funzione viene creata una copia dei parametri, per cui i parametri di fatto risultano essere delle normali variabili locali alla funzione inizializzate con i valori passati.

    Se effettui un passaggio per puntatore, invece, la copia che viene creata non è del contenuto delle variabili passate come parametri, ma del loro indirizzo, per cui la funzione, sapendo l'indirizzo a cui si trovano le variabili passate, le può modificare senza problemi.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Originariamente inviato da gennahouse
    1 a cosa servono i puntatori.
    2 come i usano i puntatori.
    Vedi un pò qui.
    È ben spiegato..

  8. #8
    Originariamente inviato da MItaly
    Perché in C i parametri delle funzioni sono passati per valore, ossia quando viene chiamata la funzione viene creata una copia dei parametri, per cui i parametri di fatto risultano essere delle normali variabili locali alla funzione inizializzate con i valori passati.

    Se effettui un passaggio per puntatore, invece, la copia che viene creata non è del contenuto delle variabili passate come parametri, ma del loro indirizzo, per cui la funzione, sapendo l'indirizzo a cui si trovano le variabili passate, le può modificare senza problemi.
    LO so che scoccio, però puoi spiegarmelo come se dovessi spiegarlo a un bambino di 5 anni?

    Non so ho veramente problemi a capire il funzionamento dei puntatori =(

    EDIT: Grazie Simo, sto leggendo la guida, speriamo che riesco a capirla...

  9. #9
    Un puntatore e' un tipo di dato, una variabile che contiene l'indirizzo
    in memoria di un'altra variabile. Si possono avere puntatori a qualsiasi tipo
    di variabile.
    Quindi il puntatore è una variabile esempio: int *puntatore; se ho capito bene.

    Non ho capito bene però il discorso della memoria, dice, che contiene l'indirizzo in memora, inteso come byte, esepio CHAR 1 byte?

    E se ho capito bene alla fine dice che si possono avere puntatori Char int, float e Doble giusto?


    La dichiarazione di un puntatore include il tipo dell'oggetto a cui il
    puntatore punta.
    In C ogni variabile ha due tipi di valori: una locazione e un valore
    contenuto in quella locazione.
    Qui dice, che se come uso come puntatore un int dovro usare solo variabili int?
    allora la variabile ha due tipi di valori da quanto dice qui, ora faccio un esempio da come ho capito io:

    int x = 10;

    la locazione è 4 byte perche int occupa 4 byte
    il valore del esempio invece è 10 perche è il valore della variabile.

    questa parte è giusta?

    L' operatore & (operatore unario, o monadico) fornisce l'indirizzo di una
    variabile.
    L' operatore * (operatore indiretto, o non referenziato) da' il contenuto
    dell'oggetto a cui punta un puntatore.
    & serve per sapere la grandezza in byte della variabile oppure per sapere che preciso spazio nella memoria è allocata?

    * questo serve solo ad ottenere il contenuto? come prima nell esempio int x = 10; serve a recuperare il 10?

    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 fornita dal sito:

    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).
    allora, nella iestruzione 1, succede che pointer si sposta nella stessa memoria di x?

    nella 2 succede che y prende il valore di x perche il pointer è nello stesso spazio della memoria?

    nella 3 perche x assume un valore di 100 da pointer se pointer non ha un valore specificato nello script?
    Da come avevo capito io pointer valeva 1 e non 100.

    Nella 4 fa vedere che se io cambio il valore a point con un altro dato di conseguenza anche la variabile associata cambia.
    Però se io al posto di cambiare il contenuto di point con un numero come nell esempio lo faccio con una variabile cosa succede? pointer lascia x per l'altra variabile? e se si, x assume sempre il valore dell'altra variabile prima di essere lasciato da pointer?

    Vale la pena considerare cosa succede al "livello macchina" in memoria per
    capire completamente come funzionano i puntatori.
    Supponiamo che la variabile x si trovi nella locazione di memoria 100, y nella
    200 e pointer nella 1000 (ricordiamo che pointer e' una variabile a tutti gli
    effetti, e cosi' il suo valore necessita di essere memorizzato da qualche
    parte; e' la caratteristica del valore dei puntatori che risulta nuova).

    Cosa intende qui per locazione di memoria 100, 200 o 1000? non riesco proprio a capirlo =(

  10. #10
    Originariamente inviato da gennahouse
    Quindi il puntatore è una variabile esempio: int *puntatore; se ho capito bene.
    Esatto.
    Non ho capito bene però il discorso della memoria, dice, che contiene l'indirizzo in memora, inteso come byte, esepio CHAR 1 byte?
    No. L'indirizzo di memoria non è la dimensione della variabile a cui punta, ma la sua posizione in memoria.
    E se ho capito bene alla fine dice che si possono avere puntatori Char int, float e Doble giusto?
    Si possono avere puntatori a qualunque tipo. In linea concettuale, un puntatore può puntare a qualunque cosa (le dimensioni di un indirizzo sono le medesime per qualunque tipo), il tipo di puntatore serve solo per dare un'interpretazione di cos'è ciò a cui il puntatore punta.
    Qui dice, che se come uso come puntatore un int dovro usare solo variabili int?
    Un puntatore a int può puntare solo a variabili int. (in pratica poi si possono fare delle forzature tramite cast, ma questo per ora non ti interessa)
    allora la variabile ha due tipi di valori da quanto dice qui,

    ora faccio un esempio da come ho capito io:

    int x = 10;

    la locazione è 4 byte perche int occupa 4 byte
    No. La dimensione della variabile è 4 byte. Sulla sua posizione in memoria in linea di principio non si può dire nulla, se non che la si può ricavare tramite l'operatore &.
    il valore del esempio invece è 10 perche è il valore della variabile.
    Esatto.
    & serve per sapere la grandezza in byte della variabile oppure per sapere che preciso spazio nella memoria è allocata?
    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.
    * questo serve solo ad ottenere il contenuto? come prima nell esempio int x = 10; serve a recuperare il 10?
    * serve per ottenere il contenuto dell'indirizzo a cui punta un puntatore. Naturalmente si usa solo con i puntatori, nel senso che con variabili non-puntatori per ottenerne il valore non bisogna fare nulla di speciale.
    allora, nella iestruzione 1, succede che pointer si sposta nella stessa memoria di x?
    Sì; per dirla più correttamente, a pointer viene assegnato l'indirizzo di memoria di x.
    nella 2 succede che y prende il valore di x perche il pointer è nello stesso spazio della memoria?
    Perché pointer punta allo stesso spazio di memoria di x.
    nella 3 perche x assume un valore di 100 da pointer se pointer non ha un valore specificato nello script?
    Da come avevo capito io pointer valeva 1 e non 100.
    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.

    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).
    Nella 4 fa vedere che se io cambio il valore a point con un altro dato di conseguenza anche la variabile associata cambia.
    Però se io al posto di cambiare il contenuto di point con un numero come nell esempio lo faccio con una variabile cosa succede? pointer lascia x per l'altra variabile? e se si, x assume sempre il valore dell'altra variabile prima di essere lasciato da pointer?
    No. Se tu fai
    codice:
    *pointer=y;
    la memoria a cui punta pointer (e quindi di fatto x) assumerà il valore che ha y. Se tu invece vuoi fare sì che il puntatore punti a y, dovrai fare:
    codice:
    pointer=&y;
    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.
    Cosa intende qui per locazione di memoria 100, 200 o 1000? non riesco proprio a capirlo =(
    Semplificando molto, la memoria del computer la si può vedere come una sequenza contigua di byte; quando dichiari una variabile, questa viene messa in un certo posto in memoria; per riferirsi a questo posto, si usa la distanza in byte dall'inizio della memoria, ossia il suo indirizzo di memoria.
    Amaro C++, il gusto pieno dell'undefined behavior.

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