Post by Marco#include "stdio.h"
Perche' non #include <stdio.h>??
Post by Marcoint 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???
Non e' che porta "benefici", semplicemente ti permette di esprimere cose
che altrimenti non potresti fare.
Ricorda, infatti, che i puntatori consentono ad una funzione di
modificare delle variabili del codice chiamante (infatti i parametri di
una funzione sono passati per valore, e non riferimento, e quindi senza
i puntatori, tutte le modifiche che fai ai parametri vengono perse a
fine chiamata).
In questo caso, semplicemente, puoi essere interessato a voler cambiare
il valore di una variabile che ha come tipo int*. Quindi, devi passare
un puntatore a quella variabile, che guarda caso e' proprio int** :P
Infatti, nel frammento di codice che mi hai passato, la funzione vuole
modificare il suo parametro: se usasse un puntatore singolo, non lo
potrebbe fare (o meglio, se lo facesse, le sue modifiche verrebbero
perse quando esce dalla funzione e viene perso il suo ambiente locale).
Post by MarcoIn +, 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,
No: gli viene passato un puntatore ad una variabile puntatore che punta
al valore 6 - e' piuttosto diverso e piu' complesso :)
Inoltre, la cosa importante e' che, se segui il codice, noti che p ora
punta alla variabile static n dentro alla funzione; quindi tu hai
passato un puntatore ad un puntatore alla variabile n, che in quel
momento contiene il valore 6.
Post by Marcoa cui poi gli
viene assegnato nella funzione il valore 5 (5+6=11)
No: le variabili statiche vengono inizializzate una sola volta (ad
inizio programma, o alla prima chiamata di funzione al max direi);
d'altronde, se non fosse cosi', le variabili statiche diventerebbero
inutili, e si comporterebbero in pratica come delle variabili locali,
con veramente pochi vantaggi (pensaci su...).
Quindi, la variabile n ha conservato il valore che aveva da prima - che
e' 6, come dicevamo.
Post by Marcoe riportato
quest'utlimo valore... c'è qualcosa che non ho capito sicuramente,
ma ...cos'è????
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
--
/**
* Mattia Belletti - Undergraduate student @ cs.unibo.it
* ICQ: 33292311 - email: ***@cs.unibo.it
* IRC: BluShine - site(s): http://cs.unibo.it/~mbellett
* Linux registered user 299762 @ Linux registered machine 213003
*/