Oppure

Loading
18/07/11 15:20
Sam89
Sapete dirmi nel dettaglio cosa fa questo programma? :-?:-?
Domanda specifica: cosa fa esattamente un doppio puntatore?


int **f (int *p)
{
   int **x=&p;
   *(*x+1)=*p+2;
   return x;
}

main()
{
   int b[]={2,3}, *q=b;
   **f(q)=*q+2;
   cout << b[0] << b[1] << *q;
}



Questo è uno dei problemi che ci mettono all'esame di programmazione all'università.. -.-"
aaa
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 ...
18/07/11 21:55
Sam89
GRAZIE MILLE!
Mi avete dato davvero delle risposte ottime, semplici e comprensibili..! :) :k:
aaa
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 8:49
Sam89
Postato originariamente da 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.

Ma guarda, sono d'accordo con te.. pensa che il nostro prof all'università ci fa perfino fare la prova di correttezza del programma..! Nella ricorsione addirittura la prova induttiva.. da spararsi!
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 ...