Newsgroup: it.comp.lang.c
Titolo: Puntatori a Puntatori

    Salve a tutti ... frequento da pochi gg questo ed altri NG sulla
prgrammazione... la mia passione per il C ma il mio poco tempo a
disposizione hanno fatto si che non lo imparassi mai bene come volevo... per
non pensare ai linguaggi OO ...
    Allora mi affido a voi per cercare di capire una cosa forse a molti
scontata...
    Un puntatore a puntatore e' una variabile che contiene l'indirizzo di
un'altra variabile? Chi mi puo' spiegare in parole povere dove sta la loro
utilita' e magari fare un esempietto semplice semplice per capirne il loro
uso?
    Grazie :-)

 uso?
[...]
Un puntatore a puntatore e' una variabile che contiene l'indirizzo
(qualunque cosa questo voglia dire) ad un'altra variabile puntatore
(che quindi contiene un altro indirizzo).
L'esempio tipico sono gli array di stringhe, dato che di solito i
parametri di un programma vengono passati alla funzione main in questo
modo: main(int argc, char **argv) ...oppure main(int argc, char *argv[])
Dato che una stringa di caratteri e' implementata di solito come
un'array di caratteri e di solito ci si riferisce ad essa e ai suoi
elementi con un puntatore a carattere (char*).
Per riferirsi ad un array di stringhe e ai suoi elementi si usa un
puntatore ad un puntatore a caratteri (char**).
Altro caso tipico e' quando si vuole costruire una matrice (cioe' un
array bidimensionale) di qui non si conoscono le dimensioni a priori, o
una "matrice" in cui le righe non hanno tutte la stessa dimensione.
(per favore non apriamo un nuovo lungho thread su quest'ultimo
argomento, dato che mi pare gia' stato sufficientemente dibattuto:
andate a vedervi i vecchi messagi del newsgroup da qualche parte!!)
Un saluto
  Lucio
--
(
  Lucio Benfante
 
http://www.dei.unipd.it/~benfante
                                          )
Sent via Deja.com 
http://www.deja.com/
Share what you know. Learn what you don't.

 uso?
Un puntatore è una variabile che contiene l'indirizzo di un'altra variabile.
Un puntatore, in genere, viene utilizzato per gestire dinamicamente la memoria,
array, strutture dati.
Un array dinamico di interi può essere, ad esempio...
int *arrayInteri;
int numOfElements = 5;
arrayIntery = (int *)malloc(sizeof(int)*numOfElements);
Ma se tu avessi bisogno di una matrice gestita dinamicamente?
Un puntatore che punta ad un'array di puntatori, oguno dei quali punta ad
un'array
di unteri
int **matrice;
int numOfRows;
int numOfCols;
int i;
matrice = (int **)malloc(sizeof(int *)*numOfRows);
for (i=0; i<numOfRows; i++)
  matrice[i] = (int *)malloc(sizeof(int)*numOfCols);
matrice[0][0]=1;
matrice[2][1]=5;
Ecco la nostra matrice!
Se ci pensi, anche l'argv passato come argomento al main
è del tipo char **, cioè una matrice di elementi base(char),
ossia un'array di stringhe.
Un altro utilizzo può essere una funzione che modifica il
valore di un puntatore.
main (int) {
  int *pi;
  pi = NULL;
  allocami (&p);
}
allocami (int **pi) {
  *pi = (int *)malloc(sizeof(int));
}
Ciao.

 uso?
Utilizzo tipico è quello di una funzione che inizializza una lista. Per
poterne creare la testa è necessario che la funzione stessa possa
modificare il puntatore alla testa della lista e quindi ha bisogno del
puntatore a tale puntatore.
EMG

...


 struct contenente un punt al next ed uno al previous?
Come struttura del singolo elemento della lista si. Ma la testa della
lista non può essere indirizzata da un suo elemento. Abbiamo quindi
bisogno di un puntatore. E se vogliamo che la lista venga creata da una
singola funzione una cosa del genere non funzionerebbe:
void CreaLista( Lista *testa );
in quanto il puntatore testa all'uscita della funzione continuerebbe a
non essere inizializzato. Dobbiamo quindi passare il puntatore stesso
come indirizzo:
void CreaLista( Lista **testa );
in modo tale da poterne cambiare il valore impostandolo al primo
elemento della lista che la funzione stessa creerà.
Spero di essermi spiegato meglio.
EMG