18/07/11 15:44
sarbaturino
Non riesco a capire bene la scrittura del programma, ma penso che ci siano degli errori.
int **f;
E' un puntatore ad un puntatore;
Tale scrittura, semanticamente può essere visto come una matrice dinamica ad esempio:
#include <iostream>
using namespace std;
const int dimensione=5;
int main()
{
int **M= new int *[dimensione];
for (int i=0; i<dimensione; i++)
M[ i ]= new int [dimensione];
//Fin qui è come se avessi creato una matrice dimensioneXdimensione->5x5;
for (int i=0; i<dimensione; i++)
for (int j=0; j<dimensione; j++)
M[ i ] [ j ]=0;
for (int i=0; i<dimensione; i++)
delete [ ] M[i];
delete [ ] M;
return 0;
}
//Semplice semplice;
Ultima modifica effettuata da sarbaturino 18/07/11 15:48
aaa
18/07/11 15:46
sarbaturino
delete []M [ i ];
delete []M;
Ultima modifica effettuata da sarbaturino 18/07/11 15:46
aaa
18/07/11 15:51
Sono programmi per esercitarsi a capire i puntatori e i doppi puntatori ... non fanno nulla di particolare e non sono sbagliati ...
Un puntatore ad un puntatore è semplicemente l'indirizzo dell'indirizzo di una variabile ...
Per capire questo passo passo ...
-- nel main --
int b[]={2,3} : dichiara un vettore di due elementi interi e assegna al primo elemento il valore 2 e al secondo elemento il valore 3
int *q=b : assegna al puntatore q l'indirizzo iniziale del vettore (che è anche l'indirizzo del suo primo elemento)
f(q) : chiama la funzione f passando come argomento il valore del puntatore q (cioè chiama la funzione f passando l'indirizzo del vettore b)
-- nella funzione f --
int **x=&p : dichiara x come doppio puntatore e lo fa puntare all'indirizzo del puntatore p (x diventa l'indirizzo dell'indirizzo del vettore b)
*p+2 : ottiene il risultato della somma del valore a cui punta p con 2 (dato che p punta al primo elemento del vettore, somma 2 con 2 e ottiene 4 che sfrutta in seguito)
(*x+1) : ottiene il puntatore al prossimo elemento del vettore b
*(...)=... : assegna a tale elemento il risultato precedente, ovvero assegna al secondo elemento del vettore b (che era 3) il nuovo valore 4
return x; : restituisce il puntatore al puntatore al vettore b (ovvero il puntatore al puntatore al primo elemento del vettore b)
-- nel main --
*q+2 : ottiene il risultato della somma del valore puntato dal puntatore al primo elemento più 2 (ovvero 4)
**f(q) : assegna al valore puntato dal puntatore al puntatore restituito (ovvero al primo elemento) il risultato precedente (ovvero 4)
alla fine visualizza il primo elemento (che sarà 4) , il secondo elemento (che sarà 4), il valore puntato dal puntatore al primo elemento (sempre 4)
Otterrai a video i valori
4 4 4
(magari uno accanto all'altro senza spazi) che è quello che vorrà sapere il professore per capire se hai capito ...
19/07/11 8:40
Il Totem
Questo è uno dei motivi per cui iniziare a programmare in C dà problemi: ci si focalizza troppo sui tecnicismi e troppo poco sulla logica del programma.
aaa
19/07/11 15:22
Il C è nato tanto tempo fa. Aveva i suoi perché lavorare con puntatori e memoria e allora era il top.
Adesso è difficile usarlo per progetti (anche se di piccole o medie dimensioni) ma aiuta sicuramente ad "aprire la mente"; ovviamente, esistono anche soggetti su cui non ha effetto ... ma non si possono pretendere miracoli ...