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

Discussione: [c++] puntatori?!?

  1. #1
    Utente di HTML.it L'avatar di Beziel
    Registrato dal
    Oct 2002
    Messaggi
    697

    [c++] puntatori?!?

    Ciao a tutti,
    Qualche anima pia mi spiega bene cosa sono e a che servono, magari con qualche esempio?



    Grazie

  2. #2
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Una normale variabile, come un intero, contiene semplicemente i dati che ci servono.
    Un puntatore è una variabile che contiene l'indirizzo di memoria di una variabile.
    Gli operatori più importanti sono * e &.
    & , posto prima di una var, ne restituisce l'indirizzo, cioè la locazione di memoria.
    *, posto prima di un puntatore, restituisce il valore della variabile puntata, non la locazione di memoria.

    Esempio:
    codice:
    // dichiaro 2 normali interi
    int x=10, i=20;
    
    // un PUNTATORE a variabile intera!
    // da notare il * prima di punt, che dice che è un puntatore
    int *punt;
    
    // Assegno a punt l'indirizzo di x
    // da notare & che mi dice "l'indirizzo di "
    punt = &x;
    // Scrivo la locazione di memoria
    cout << "locazone di memoria: " << punt<<endl;
    //Scrivo il valore puntato da punt, cioè x
    //da notare il *
    cout << "Valore: " << *punt << endl;
    
    //Cambio la variabile puntata
    punt = &i;
    //ora invece scrive il valore di i!  :eek: 
    cout << "Valore: " << *punt << endl;
    Puntatori e vettori sono strettamente collegati.
    Come vedi in questo codice, ogni puntatore ha un tipo.
    punt è di tipo "int *", puntatore ad intero.
    se faccio
    codice:
    punt++;
    non incremento il valore della var puntata, ma della locazione di memoria di punt!
    Da notare che non la incremento di 1 byte, ma in modo da puntare al prossimo int, cioè 4 byte!
    Se invece era dichiarato come "float *", sarebbe stato incementato di 8 byte (la dimensione di un float).


    Codice:
    codice:
    // Vettore di float
    float vett[4] = {2.0, 3.4, 4.5, 5.6};
    //Puntatore a intero
    float *punt;
    
    //Gli assegno l'indirizzo di vett[0]
    punt = &vett[0];
    //Sarebbe stato uguale così:
    //punt = vett;
    
    //accedo al primo elemento
    
    cout << *punt << " ";
    //secondo elemento
    // da leggersi:
    // Scrivi il valore che si trova alla locazione di memoria
    // (punt + 1), cioè il prossimo float dopo punt, cioè
    // vett[1]
    cout << *(punt + 1) << " ";
    
    // modifico l'elemento 4
    *(punt + 3) = 34.7;
    // Scriverà 34.7
    cout << vett[3];

  3. #3
    Utente di HTML.it L'avatar di Angioletto
    Registrato dal
    Jan 2004
    Messaggi
    1,246
    Ti faccio un piccolo esempio.
    Immagina allo scambio dei parametri,esso può essere sia per valore che per riferimento. Nel primo caso tu passi alla funzione una copia del dato su cui deve lavorare, nel secondo caso gli passi direttamente il dato perchè magari tale fuzione, al termine delle sue operazioni, ne altera il valore.

    Come avviene quest'ultimo passaggio?? Grazie ai puntatori..
    Vedile come delle variabili integer che contengono l'indirizzo della variabile a cui puntano,quindi,nel momento in cui passi un dato per riferimento, tu dai alla funzione l'indirizzo della locazione di memoria che contiene quel dato.

    Pure il passaggio per valori può essere fatto attraverso i puntatori anche e soprattutto quando il dato da passare è di dimensioni notevoli:anzichè copiarlo e perdere molto tempo è preferibile indicare dove è memorizzato.Ad esempio:

    void stampa ( const int &i )

    Il simbolo & ti restituisce l'indirizzo della variabile che lo segue ( i ), grazie a const suggerisci alla funzione di non alterarla e il gioco è fatto!!!Ho messo int e forse non è il più calzante degli esempi,ma al suo posto puoi benissimo mettere una struct,un array,o comunque qualcosa di più corposo...

    Questa è solo una delle tante applicazioni dei puntatori..
    Se vuoi ne possiamo continuare a parlare...

    Tieni a mente che contengono un indirizzo, un riferimento a un dato qualsiasi, semplice o strutturato!!!

    Spero di essere stato chiaro..fammi sapere!!

  4. #4
    si non e' per dire ma i p. sono stati supertrattati - anche da me - in questo forum. Perche' non fate una ricerca per le cose piu' ovvie??

    comunque, vorrei aggiungere, visto che e' MOLTO importante, l'operatore -> che permette di accedere ai membri di una struttura/unione/classe previa un puntatore ad essa. Ogni programmatore in C++ se vuole sfruttare le potenzialita' polimorfiche run-time di questo linguaggio dovrebbe fare buon uso di questo operatore.

    Esempio:
    codice:
    struct Asd
    {
     int a, b;
    };
    
    int main()
    {
     Asd o, *p;
     p = &o;
     p->a = 2 * p->b;
    }
    capito? semplicissimo come usare un puntatore

    Non mi addentro nei dettagli, ma ricollegandomi al discroso del polimorfismo run-time, fa comodo questo operatore (e quindi i puntatori) quando si vuole accedere a membri di classi derivate contenenti funzioni virtuali e altre cose del genere. basta solo dire che un puntatore alla classe padre e' un puntatore valido anche per la classe figlio.

    FATE PIU' RICERCHE E MENO DOMANDE!
    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

  5. #5
    Utente di HTML.it L'avatar di Beziel
    Registrato dal
    Oct 2002
    Messaggi
    697
    Grazie di cuore a tutti quanti

  6. #6
    Interessante discussione...

    Potete postare un piccolissimo codice da compilare in DEV C++ dove mi fate capire eseguendolo cosa significa allocare e deallocare (ho visto che negli esempi c'è la chiamata del puntatore ma non la dismissione)?

    In modo da vedere anche cosa effettivamente viene scritto dal programma.

  7. #7
    deallochi con delete...se hai allocato con l'operatore new precedentemente

  8. #8
    Utente di HTML.it L'avatar di Angioletto
    Registrato dal
    Jan 2004
    Messaggi
    1,246
    Ecco un esempio semplice semplice..

    int* p = new int;

    L'operatore new alloca un area di memoria (che il sistema operativo provvede a fornire) atta ad ospitare un valore del tipo int e restituisce il puntatore a tale area:in p si ottiene l'indirizzo di quella memoria.E' il tipo che implicitamente definisce l'ampiezza dell'area di memoria occorrente.

    Noto che solo attraverso p si può raggiungere quelle locazioni di memoria: se cancello solo il puntatore,addio memoria!!!Infatti non ho + alcun riferimento relativo a quei registri.Quando quella parte di memoria non serve +,allora è necessario deallocarla:

    delete p;

    Chiaro??

  9. #9
    Utente di HTML.it L'avatar di Angioletto
    Registrato dal
    Jan 2004
    Messaggi
    1,246
    Provate a questo indirizzo:

    http://programmazione.html.it/cplusp...lusplus_28.htm

    Ma sul sito potreste anche trovare dell'altro,sui puntatori,su new e delete..

    Comunque ho pronto un altro pezzo di codice

    typedef struct {
    char* nominativo;
    int numtel;
    } individuo;

    individuo* i = new individuo;

    // Ho spazio in memoria per contenere la struct.
    // i contiene l'indirizzo di quest'area di memoria.

    nominativo è però un puntatore,durante il programma potrei inizzializzarlo con new:

    i -> nominativo = new char[..];

    ° new char perchè nominativo è un puntatore a char;
    ° nelle parentesi quadre andrebbe la dimensione della stringa,ma in questo contesto credo non abbia senso inserirla...

    Alla fine del programma devo deallocare la memoria :

    delete i -> nominativo;
    delete i;

    Ovviamente cancello prima il puntatore nominativo, che è un campo della struct, poi la struct: se faccio il contrario perderei il riferimento necessario per deallocare il puntatore nominativo!!!

    Quindi massima attenzione sul corretto uso della deallocazione!!!

  10. #10
    Se fosse stato io il moderatore del forum vi avrei preso a calci... peccato che non lo sono

    Anche la new e la delete sono stare ipe-trattate, perche' non fate una c@##0 di ricerca?!?!?

    Avete mai letto il regolamento del forum!?!?

    comunque non e' per dire, ma la allocazione e la deallcazione non si fanno per forza con new e delete. Volevo si usa anche malloc(), ma e' per il C (comunque e' giusto saperlo)

    Inoltre l'allocazione dinamica avviene nello heap, mentre quando assegni una variabile (anche quella e' una allocazione) avviene nello stack.

    CERCATE PRIMA DI POSTAREEEE

    #exclude <windows.h>
    Powered by Gentoo GNU/Linux
    Cos'e' l'impossibile se non una questione di tempo?
    Riesumare i post vecchi non e' sbagliato, e' una risposta o la continuazione di un thread. Meglio riesumare che creare di nuovi :]

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.