Newsgroup: it.comp.lang.delphi
Titolo: Puntatori

Ciao a tutti, vorrei porvi una domanda a cui non sono ancora riuscito a dare
una risposta esauriente.
A cosa servono i puntatori?
Molti mi dicono per risparmiare memoria... per rendere il programma più
leggibile... ma che! io con i puntatori mi confondo di più.
Potreste farmi un esempio di codice (non tanto complesso) in cui non ci
siano i puntatori, seguito da uno uguale con in puntatori, in modo da capire
i vantaggi del loro utilizzo?
Grazie.
--
Luigi Cartelli

se ti hanno detto che servono per risparmiare memoria, non ti hanno detto
una stupidagine. E' pur vero che oggigiorno perde significato il concetto di
risparmio di memoria quando esistono sistemi con 128,192,256Mb RAM di
sistema.
Cmq per farti capire: immagina di creare un programma per memorizzare dei
dati. Non conosci a priori la dimensione dei dati da trattare. Che fai? Ti
crei un array? Quanto grande? Dovresti dare una dimensione. Ma quanto? 10Mb?
e sei dati sono 100Mb?Oppue sei dato occupano solo 10K?Non e' uno spreco di
memoria?
Allora si usano i puntatori per creare dinamicamente un "oggetto" che possa
contenere quello che serve, pur non sapendo a priori la dimensione di nulla.
Poi quando non ti serve piu' il tuo "oggetto" lo elimini liberando la
memoria occupata.
Nella letteratura informatica la prima cosa a cui si associano i puntatori
sono Liste,Code,Pile,Alberi.
Ora la scelta e' piu' ampia.
Spero di essere stato esauriente.
Ciao
Guybrush

i vantaggi del loro utilizzo?
Se vuoi ti scrivo una lista, ma dubito che ti possa chiarire le idee, almeno
inizialmente!
Ciao
--
- Carlo -
BSSoftware Tips Mailing-List Support

Principalmente servono per rappresentare strutture dati non lineari (es.
alberi), come pure quelle lineari ma di lunghezza non definita a priori (es.
liste di dati, code, stack). Nell'applicazione pratica possono servire ad
esempio in elaborazioni di statistiche complesse, dove i dati devono essere
accorpati in gerarchie ed elaborati, oppure in algoritmi specifici
(compressione dati, crittografazione), dove comunque le relazioni tra i dati
non sono strettamente lineari e di lunghezza predefinita.
Ciao, Sandro

And last but no least:
Rendono possibile il funzionamento della VCL e dei suoi costrutti semplici
ed eleganti..... ;))
Inferno

In breve i puntatori servono per creare
degli array dinamici, ovvero dei vettori
di cui non si conosce la grandezza a priori, senza sprecare
memoria e utilizzare solo quella necessaria.
Semplice codice commentato:
type
  TpMioRecord = ^TMioRecord;   // ^ significa che "punta" a quel tipo
  TMioRecord = record        
                X,Y,Z: Integer;
                A,B,C: Char;
               end;
var
  pMiorecord: TpMioRecord;     // dichairazione variabile puntatore
begin
 New(pMiorecord);    // crea un nuova istanza del record 
                     // (crea lo spazio in memoria)
 
 pMiorecord^.X:=1;   // riempe il campo X del record, nello spazio di mem
                     // appena creato
 pMioRecord^.A:='*'; // idem con il campo A ...
 ...
 
 ...infine per liberare la memoria devi usare 
 Dispose(pMioRecord);
 per fare un array in modo semplice (anche qui i programmatori di Delphi
 ci hanno pensato bene) c'è l'oggetto TList, che mantiene, appunto
 un lista di puntatori con questi  semplici metodi:
 List.Add(pMioRecord);     // per aggiungere un punt alla lista
 List.Delete(pMioRecord);  // per cancellarlo
 List.Items[n]             // per accedere all'ennesimo puntatore
spero di essere stato chiaro.
..ha dimenticavo, lo stesso codice senza puntatori potrebbe essere il seguente:
var
 Vettore [1..Numero_che_scelgo_io_a_Occhio] of TMioRecord;
se il n° che ho scelto è 
 troppo grande  --> spreco memoria
 troppo piccolo --> ... ;)
spero di esser stato chiaro
Ciao
Alan
 
---
Questo servizio e' realizzato con Wappi della Virtex
Connetti ad internet il tuo telefonino: 
http://www.wappi.com/
--
Posted from [194.243.91.36] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG


esempio di codice con i puntatori:
form1.edit1.text:='ciao';
form1.label1.text:='prova';
esempio di codice senza puntatori:
{commento}
{commento}
------------------------------------
con questo voglio dire che i puntatori in Delphi sono sempre usati, la
variabile form1 e' un puntatore.
Adesso resta a te decidere se voler rimanere ignaro di quello che scrivi o
di voler approfondire la cosa. Se non conosci i puntatori (e il loro uso)
farai dei programmi che arriveranno fino ad un certo punto, ma non oltre. Se
impari ad usare i puntatori avrai strade piů ampie.
Matteo Tosato

     PVettore = ^TVettore ;
E fare utilizzo di puntatori....PVettore = ^TVettore ;
:)


Si, scrivila. Tentare non nuoce :)
Grazie
Ciao.

I puntatori sono una gran figata. Ti consentono di fare tantissime cose. Uno
degli utilizzi meno noti, ma piů utili, č quello di utilizzarli per rendere
il programma piů piccolo. Esempio ?
Snippet :
// I puntatori ad un tipo possono essere definiti anche PRIMA della
definizione del tipo stesso.
Type PMioDatoStrutturato = ^TMioDatoStrutturato;
        TMioDatoStrutturato = record
          Righe : array[ 1..100 ] of Word;
          Colonne : array[ 1..100 ] of Word;
       end;
...
// Ecco la differenza :
procedure ElaboraDatoStrutturatoSenzaPuntatori( Dato :
TMioDatoStrutturato );// occupa 400 bytes di stack
// Ed ecco i "pointers" !!!!
procedure ElaboraDatoStrutturatoConPuntatori( Dato :
PMioDatoStrutturato );// occupa __4__ bytes di stack
E se vuoi aumentare righe e colonne, ad esempio, nel primo caso la
dimensione aumenta.
Nel secondo, INVECE, la dimensione E' COSTANTE.
Non credo tu abbia bisogno di altri argomenti per passare ai puntatori...
Ah, immagino tu possa avere qualche problema nel loro utilizzo.
Beh, sappi che il carattere "^" in Delphi e TP viene usato per indicare che
si vuole accedere al VALORE puntato dal puntatore( scusate il bisticcio di
parole ). Nel caso di un array l'utilizzo corretto č il seguente :
Dato^.Righe[ Indice ] dove Indice rappresenta l'indice dell'array. Nel caso
di puntatori ad array SINGOLI come in
Type PMioDatoStrutturato2 = ^TMioDatoStrutturato2;
         TMioDatoStrutturato2 = array[ 1..100,1..100 ] of Word;
...
var Dato2 : PMioDatoStrutturato2;
il modus accessendi č come segue : Dato2^[ Indice1,Indice2 ] oppure
ato2^[ Indice1 ][ Indice2 ].
Credo sia proprio tutto.
Ciao !
Andrea Raimondi
