Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657

    [C++] Passaggio per indirizzo

    Studiando il mio libro di scuola sono arrivato a una parte ke tratta il passaggio per indirizzo. Io ho fatto l'esempio descritto sul libro ma nn credo di aver capito bene.
    codice:
    #include <iostream.h>
    #include <conio.h>
    
    void scambia(double &a, double &b);
    
    void main() {
    	double x = 1, y = 100;
    	clrscr();
    	cout<<"Prima lo scambio\tx="<<x<<"\ty="<<y;
    	scambia(x,y);
    	cout<<"\nDopo lo scambio\tx="<<x<<"\ty="<<y;
    	getch();
    }
    
    void scambia(double &a, double &b) {
    	double tmp;
    	tmp = a;
    	a=b;
    	b=tmp;
    }
    Grazie a tutti

  2. #2
    Quel tipo di chiamata si chiama "per riferimento", mentre quello classico (senza gli &) viene chimato "per valore".
    Se una variabile viene passata per valore, ne viene effettuata prima una copia, ed è questa copia che viene passata alla funzione. Tutte le modifiche che la funzione chiamata effettuerà su quella variabile non influenzeranno la variabile originaria, ed il risultato di tali modifiche deve essere passato al chiamante con un return.
    I passaggi per riferimento invece consentono alla funzione chiamata di accedere, e modificare, direttamente i dati del chiamante, ed infatti nel tuo esempio il tipo di ritorno della funzione è void.

    Ti ho confuso ancora di più, vero?

  3. #3
    codice:
    #include <iostream.h>
    #include <conio.h>
    
    void scambia(double &a, double &b);
    
    void main() {
    	double x = 1, y = 100;
    	clrscr();
    	cout<<"Prima lo scambio\tx="<<x<<"\ty="<<y;
    	scambia(x,y);
    	cout<<"\nDopo lo scambio\tx="<<x<<"\ty="<<y;
    	getch();
    }
    
    void scambia(double &a, double &b) {
    	double tmp;
    	tmp = a;
    	a=b;
    	b=tmp;
    }
    Se tu non avessi messo le & su (double &a, double &b), appena saresti uscito dalla funzione, la variabile x avrebbe avuto il valore 1 e y avreebbe avuto 100, mentre con la & siamo andati a modificare la variabile originaria (& ci ha permesso di andare a scrivere sull'indirizzo di memoria in cui risiede X e Y).

    Prova a vedere l'ouput del codice in questa maniera void scambia(double &a, double &b) e in questa: void scambia (double a, double b).

    Spero di non aver detto cazzate sulla spiegazione di &, cmq quando arriverai a studiare i puntatori ti sarà tutto più chiaro.


    Ciao

  4. #4
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    Da quello ke ho capito è ke il prefisso & crea una copia di x e y, xo ti permette di modificare x e y con altri identificatori...ho detto giusto??

  5. #5
    Originariamente inviato da FinalFantasy
    Da quello ke ho capito è ke il prefisso & crea una copia di x e y, xo ti permette di modificare x e y con altri identificatori...ho detto giusto??
    L'esatto contrario di quello che hai detto...

    Con la Reference "&"
    passi alla funzione la locazione di memoria della variabile
    quindi VAI a modificare la variabile "origine".

    MENTRE, passando la variabile per valore
    il compilatore crea una variabile temporanea (una copia della variabile che passi alla funzione)...
    una nuova locazione di memoria...
    (quindi, potrai modificare solo la variabile creata
    non quella origine... che si trova in una locazione di memoria diversa).
    ...Terrible warlords, good warlords, and an english song

  6. #6
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    Quindi a e b hanno la locazione di memoria di x e y?

  7. #7
    Si

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    156
    Per farla semplice con la & lavorerai direttamente sulla variabile originale. Con & puoi immaginare le variabili del tuo programma cosi:

    x= è salvate nella cella di memoria 1000
    Y= è salvata nella cella di memoria 2000

    a e b passandogli con & x e y anddranno a puntare a 1000 e 2000 rispettivamente. In pratica ci saranno due variabili che punteranno alla stessa cella di memoria.

    Di solito nelle funzioni si passano le variabili per riferimento per bypassare anche il problema del return che permette di restituire il valore di una sola variabile.

    Spero di essere stato chiaro

    Matteo

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 © 2025 vBulletin Solutions, Inc. All rights reserved.