Newsgroup: it.comp.lang.c
Titolo: puntatori doppi

Ciao a tutti
Sono all'inizio della programmazione inC.
Voreri sapere 3 cose in particolare:
-cosa significa un puntatore di questo tipo :   **ptr   ?????
 E' un doppio puntatore ma a che cosa? cosa serve???
- La gestione del tipo void*   di una funzione (void*  funzione(bla bla))
mi permette di far ritornare qualunque tipo di dato, e quindi di poter usare
la stesa funzione con + tipi di dati?  (interi, caratteri,ect). 
- E' possibile far ritornare 2 valori ad una funzione?????
Scusate le sciocche domande, ma sono proprio all'inizio (e sto usando il
computer di mio cugino perchè il computer ancora non ce l'ho...questo la
dice lunga sulla mia preparazione! ))
Ciao e grazie!
Marco

 - E' possibile far ritornare 2 valori ad una funzione?????
Se proprio ti serve, potresti creare una struct che contiene entrambi i 
valori ed usare quella per il passaggio e ritorno dei parametri.
-- 
/**
  * Mattia Belletti - Undergraduate student @ 
cs.unibo.it
  * ICQ: 33292311   - email: 
mbel...@cs.unibo.it
  * IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
  * Linux registered user 299762 @ Linux registered machine 213003
  */

Una funzione che ritorna void * è utile se nn sai che tipo di dato vuoi
ritornare, ma di per se puo essere una buona idea. In fondo un puntatore,
che sia a int, a char a long a cicciobello occupa sempre i suoi bit.
Ritornando un void * ti dai la possibilita di ritornare un qualunque tipo di
puntatore.
Lo stesso malloc ha come valore di ritorno un puntatore a void che tu puoi
'casti' al tipo corretto

 Marco
ciao ...
-- 
#include <stdio.h>
int main(void){char c[]={10,65,110,116,111,110,105,111,32,98,97,114,98,111,110,
101,32,60,104,105,110,100,101,109,105,116,64,116,105,115,99,97,108,105,110,101,
116,46,105,116,62,10,10,0};printf("%s",c);return 0;}

 "l'oggetto puntato dall'oggetto puntato da ptr".
Il problema è in un programmino semplice come questo:
#include "stdio.h"
int fun(int **q){
        static int n=5;
        if (*q==NULL)
        *q=&n;
        else {
                n++;
                **q=**q+n;
                }
        return(**q);
        }
        int main(void){
                int i,j,k,*p=NULL;
                i=fun(&p);
                j = ++(*p);
                k=fun(&p);
                printf("%d %d %d\n",i,j,k);
                }
Perchè si usa un puntatore del tipo int **q ??
Che benefici porta???
In +, eseguendo il programma, mi escono i risulati 5,6 e 14.
Sui primi 2 ok, ma non capisco del perchè esca 14...teoricamente mi dovrebbe 
uscire 11... nella funziona k=fun(&p), il valore passato è 6, a cui poi gli
viene assegnato nella funzione il valore 5 (5+6=11) e riportato
quest'utlimo valore...  c'è qualcosa che non ho capito sicuramente,
ma ...cos'è????
Grazie!
Marco


Come e' stato fatto notare a me qualche tempo fa, in C non serve castare 
da void*: la conversione e' implicita, e a volte esplicitarla puo' 
essere dannoso (ad es., puo' nascondere il fatto che ci si e' 
dimenticati di includere <stdlib.h>, et similia). Quindi, sempre meglio:
int *var = malloc(size);
piuttosto che:
int *var = (int*)malloc(size);


 Sui primi 2 ok, ma non capisco del perchè esca 14...teoricamente mi dovrebbe
nella funzione viene cambiato il valore di n e quindi di **q.
Il risultato e' corretto.
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ma ...cos'è????
Beh, questo perche' il frammento di codice:
 >                 n++;
 >                 **q=**q+n;
 >                 }
Fa questo
- incrementa n, che quindi da 6 va a 7
- **q lo puoi leggere in questo modo: q e' un puntatore alla variabile p 
del main; *q quindi e' il valore di p; p, a sua volta, e' un puntatore 
alla variabile statica n, dentro la funzione in cui sei, e quindi *p e' 
il valore di n, che e' 7, come dicevamo prima. Quindi **q+n e' proprio 
come dire n+n! E quindi... 14 :)
**q = **q+n quindi dice di mettere nella cella di memoria **q (che 
abbiamo detto essere n) il valore calcolato - e quindi, mette in n il 
valore 14. Poco importa, pero', dato che poi **q (14) e' ritornato, ed n 
viene poi ignorato.
Spero di essere stato abbastanza chiaro :P
