Newsgroup: it.comp.lang.c
Titolo: puntatore a puntatori di int (int **b)

  Chi mi sa spiegare la logica di questo struttura?? Facendo delle prove
mi escono risultati differenti che non chiariscono i miei dubbi.
  Grazie a chi rispondera'.
--
Posted from 
e1.ny.us.ibm.com
 [32.97.182.101]
via Mailgate.ORG Server - 
http://www.mailgate.org

I puntatori a puntatori a int, possono essere usati (come le
altre strutture del tipo 'puntatore a puntatore') in due modi.
Il primo e' effettivamente un puntatore che punta ad una locazione
che contiene una variabile di tipo puntatore a int.
A questo punto pero' possono verificarsi due casi: 1) quella locazione
contiene un puntatore ad un singolo int e fine della storia; 2) quel
puntatore e' in realta' il puntatore al primo elemento di un array
di int, in questo caso il concetto e' "simile" ad un puntatore ad
un array di interi.
Zack

 mi escono risultati differenti che non chiariscono i miei dubbi.
Se scrivi
int i;
hai una variabile atta a contenere un intero. Se scrivi
int *pi;
hai una variabile atta a contenere un indirizzo. Se scrivi
pi = &i;
ottieni che l'indirizzo contenuto in pi è ora quello della variabile i.
Per accedere al valore contenuto in questa variabile devi scrivere, ad
esempio
printf( "%d\n", *pi );
se vuoi modificare tale valore
*pi = nuovo_valore;
L'aritmetica dei puntatori fa si che se sommi uno a pi ottieni che
questo conterrà l'indirizzo del prossimo intero. Ad esempio:
int ai[ 10 ];     /* array di 10 interi */
pi = ai;          /* non c'è bisogno dell'operatore & */
pi = pi + 1;      /* o semplicemente pi++; */
ora pi punta al secondo intero dell'array, quello di indice 1 (il primo
ha indice zero).
Ora passiamo a
int **ppi;
Questa è una variabile atta ancora a contenere un indirizzo ma non
l'indirizzo di un intero bensì quello di un puntatore ad intero. Questo
significa che l'aritmetica dei puntatori ora lo farà puntare, sempre
sommandogli uno, al prossimo puntatore ad intero invece che al prossimo
intero. Esempio:
int *api[ 10 ];     /* array di 10 puntatori ad intero */
int **ppi = api;
ppi++;
ora ppi punta al secondo puntatore ad intero dell'array, quello di
indice 1 (naturalmente nell'esempio manca l'allocazione di memoria per i
vari puntatori dell'array come a[ xx ] = malloc( sizeof ( int * ) )).
EMG
PS. Se ho scritto stupidaggini scusatemi in anticipo che sono
influenzato.

 Mailgate.ORG is maintained online by Dario Centofanti


   ------------------------------------------------------------------------



    * Subject: Re: puntatore a puntatori di int (int **b)



     *b++;
pun++;
Insomma un disastro. :-) Ti consiglio di studiare meglio.
EMG
PS. Ovviamente poteva essere risolto in molti altri modi diversi, molti
dei quali migliori di questo.

  }
while ( b != pun ) 
      printf( "%d ", *b++ ) ;
Correggetemi se ho sbagliato qualcosa ;)...
--------------------------------------------------------
* Andrea Laforgia        (
andrea_...@bigfoot.com
) *
--------------------------------------------------------

   Re: Re: puntatore a puntatori di int (int **b) 
G_Fra...@yahoo.it
 (Giorgio Frattoni)





   E' esatto?
No. Devi allocare prima memoria per l'array di dieci puntatori ad intero
b = malloc( 10 * sizeof( int * ) );
e poi quella per i dieci interi puntati da ogni puntatore
int i;
for ( i = 0; i < 10; i++ )
    b[ i ] = malloc( 10 * sizeof( int ) );
EMG

       printf("\n**b=%d %d",*b,*c);
        ^^^^ idem per *b.


   Re: puntatore a puntatori di int (int **b) 
andrea_...@bigfoot.com
 (Andrea Laforgia)


> Il K&R cos'e' un libro??
Mi viene voglia di gridare !!! ;) si' e' un libro, o meglio è IL libro
sul linguaggio C.
K sta per Kernighan, R sta per Ritchie ed entrambi sono gli inventori
del linguaggio C, che gli e' servito per la scrittura definitiva del
sistema operativo Unix.
