Ciao a tutti,
Qualche anima pia mi spiega bene cosa sono e a che servono, magari con qualche esempio?
Grazie
Ciao a tutti,
Qualche anima pia mi spiega bene cosa sono e a che servono, magari con qualche esempio?
Grazie
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:
Puntatori e vettori sono strettamente collegati.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;
Come vedi in questo codice, ogni puntatore ha un tipo.
punt è di tipo "int *", puntatore ad intero.
se faccio
non incremento il valore della var puntata, ma della locazione di memoria di punt!codice: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];![]()
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!!
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:
capito? semplicissimo come usare un puntatorecodice:struct Asd { int a, b; }; int main() { Asd o, *p; p = &o; p->a = 2 * p->b; }
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 :]
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.
deallochi con delete...se hai allocato con l'operatore new precedentemente
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??
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!!!
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 :]