Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [c] Problema Puntatori E Funzioni

    Non riesco a capire come mai questo programma stampa a video : 1 3 1 1 ...
    Se me lo spiegaste passo per passo ve ne sarei molto grato
    codice:
    #include<stdio.h>
     int funz (int a, int *b, int *c)
     {
       *b=*c;
       b=&a;
       *c=*b;
       a=*c;
       return a;
     }
    
     main()
     { int a=1, b= 2, c=3;
       int d;
       d= funz (a, &b, &c);
       printf("\% d %d %d %d\n",a, b, c, d);
     }

  2. #2
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    praticamente la funzione scambia i puntatori e i valori... il difficile è capire quando le modifiche sono al valore puntato dal puntatore, o alla cella del puntatore stesso quando ad esempio il puntatore punta ad un altra cella.

    Ecco una spiegazione in pseudo-codice:

    codice:
    il valore puntato da 'b' avrà il valore puntato da 'c'
    'b' punterà ad 'a'
    il valore puntato da 'c' avrà il valore puntato da 'b'
    il valore di 'a' sarà quello puntato da 'c'
    ritorna il valore di 'a'
    Tenendo conto che SOLO le variabili passate per riferimento come 'b' e 'c' possono subire cabiamenti il valore di 'a' rimarrà 1, visto che lui è per valore; ed ecco il motivo del primo uno ritornato.

    Il 3 viene passato a 'c', ma come si vede nel code a 'b' verrà assegnato il valore di 'c', poi 'b' va fatto puntare ad 'a' ed assumerà il valore 1. Poi a 'c' si assegna b, ed ecco l'altro uno. Infine la funzione ritorna il valore di 'a', che sarà sempre 1 visto che è per valore.

    La prima volta non è semplice capire queste cose e anche i più esperti fanno avvolte errori di questo genere con puntatori nulli, che escono dall'indice e modificano altra memoria ecc... questi problemi, e la gestione della memoria collegata ad essi, sono tipici della programmazione C.

    Diciamo che la chiave per capire tutto è:

    codice:
    ------                   -----------
    Puntatore   ----->       valore
    -------                  ------------
    se dichiari

    codice:
    int valore = 5;
    int* puntatore = &a;
    per riferirti alla cella di memoria del puntatore scrivi solo puntatore, per riferirti alla cella cui punta devi dereferenziarlo con *, quindi *puntatore.

    Queste cose si capisco con pratica, pratica, pratica e... l'altra che non me la ricordo.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  3. #3
    scusami se rispondo ora..il problema é che non ho ben capito !!Secondo quello che so dovrebbe essere così :
    *b=*c; b contiene il valore 3
    b=&a; b, avendo l'indirizzo di a, contiene il v. 1
    *c=*b; c contiene il valore 1
    a=*c; a contiene il valore 1
    return a; restituisce 1


    Com'é che col printf esce fuori che b vale 3??
    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Quando fai *b non è b che contiene il valore 3, ma il valore puntato da b ovvero la variabile passata a parametro.

    La cella puntata prima da b rimane invariata, sarà il puntatore a puntare da un'altra parte.
    Praticamente, col solito disegnino

    codice:
    ------            -----------------------------
    b     --------->  variabile passata a parametro
    ------            -----------------------------
           \
            \
             \
              \
          ----------
       a passato a parametro ma per valore
          ----------
    Come vedi b punta alla variabile b passata a riferimento, che viene modificata, quando b punterà ad a punterà da un'altra parte, b non ha valore, contiene l'indirizzo della varaibile.

    Quasta volta spero di essermi spieto meglio

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  5. #5
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Prova a guardare questo commentato:


    codice:
    #include<stdio.h>
     int funz (int a, int *b, int *c)
     {
       *b=*c;//il b nel main viene modificato col valore del c nel main
       b=&a;//il puntatore punterà ad a, che non è a del main visto che è
     //per valore
       *c=*b;//il c nel main conterrà 1, dato che b ora punta ad un 1
       a=*c;//a nel parametro avrà il valore che ha la cella puntata da c
       return a;//ritorna quindi 1
     }
    
     main()
     { int a=1, b= 2, c=3;
       int d;
       d= funz (a, &b, &c);//viene copiato il valore di a e passato
       printf("\% d %d %d %d\n",a, b, c, d);
     }
    Questa parte:

    codice:
    b=&a
    fa in modo che le modifiche su *b non ricadano sul b nel main, ma sul parametro che contiene la copia di a passato per valore.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.