Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Programma contorto
Forum - C/C++ - Programma contorto

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Sam89 (Normal User)
Newbie


Messaggi: 4
Iscritto: 18/07/2011

Segnala al moderatore
Postato alle 17:20
Lunedì, 18/07/2011
Sapete dirmi nel dettaglio cosa fa questo programma? :-?:-?
Domanda specifica: cosa fa esattamente un doppio puntatore?

Codice sorgente - presumibilmente C++

  1. int **f (int *p)
  2. {
  3.    int **x=&p;
  4.    *(*x+1)=*p+2;
  5.    return x;
  6. }
  7.  
  8. main()
  9. {
  10.    int b[]={2,3}, *q=b;
  11.    **f(q)=*q+2;
  12.    cout << b[0] << b[1] << *q;
  13. }



Questo è uno dei problemi che ci mettono all'esame di programmazione all'università.. -.-"

PM Quote
Avatar
sarbaturino (Normal User)
Pro


Messaggi: 66
Iscritto: 25/04/2011

Segnala al moderatore
Postato alle 17:44
Lunedì, 18/07/2011
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;
delete [ ] M;

return 0;
}

//Semplice semplice;

Ultima modifica effettuata da sarbaturino il 18/07/2011 alle 17:48
PM Quote
Avatar
sarbaturino (Normal User)
Pro


Messaggi: 66
Iscritto: 25/04/2011

Segnala al moderatore
Postato alle 17:46
Lunedì, 18/07/2011
delete []M [ i ];
delete []M;

Ultima modifica effettuata da sarbaturino il 18/07/2011 alle 17:46
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:51
Lunedì, 18/07/2011
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 ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Sam89 (Normal User)
Newbie


Messaggi: 4
Iscritto: 18/07/2011

Segnala al moderatore
Postato alle 23:55
Lunedì, 18/07/2011
GRAZIE MILLE!
Mi avete dato davvero delle risposte ottime, semplici e comprensibili..! :) :k:

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:40
Martedì, 19/07/2011
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.

PM Quote
Avatar
Sam89 (Normal User)
Newbie


Messaggi: 4
Iscritto: 18/07/2011

Segnala al moderatore
Postato alle 10:49
Martedì, 19/07/2011
Testo quotato

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!

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:22
Martedì, 19/07/2011
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 ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Sam89 (Normal User)
Newbie


Messaggi: 4
Iscritto: 18/07/2011

Segnala al moderatore
Postato alle 20:24
Martedì, 19/07/2011
Esattamente.. guarda passo questo esame e poi finalmente potrò passare a studiare Java che credo sia più interessante, assieme alla programmazione orientata agli oggetti e web che mi da più soddisfazione.. :D

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo