PDA

Visualizza la versione completa : [C++] Differenza passaggio per riferimento/indirizzo


AyFrank
10-01-2011, 15:51
Salve, volevo sapere sostanzialmente la differenza che c'è tra i seguenti codici:


#include <iostream>

using namespace std;

void scambia (int &, int & );

int main()
{
int a = 5, b = 7;

cout << a << " " << b << endl;

scambia (a, b);

cout << a << " " << b << endl;

return 0;
}

void scambia (int &a, int &b)
{
int c = a;

a = b;
b = c;
}


#include <iostream>

using namespace std;

void scambia (int *, int *);

int main()
{
int a = 5, b = 7;

cout << a << " " << b << endl;

scambia (&a, &b);

cout << a << " " << b << endl;

return 0;
}

void scambia (int *a, int *b)
{
int c = *a;

*a = *b;
*b = c;
}

svolgono lo stesso compito e se non erro entrambi operano sugli indirizzi delle variabili, ma di preciso qual'è la differenza?

Grazie in anticipo per le risposte

MItaly
10-01-2011, 18:05
In un caso usi i reference, nell'altro i puntatori. :bhò: Il codice eseguibile generato probabilmente sarà identico, dato che i reference risultano essere dei puntatori nascosti.

deleted_29
10-01-2011, 18:42
il primo è C++, il secondo C

Ippo343
10-01-2011, 19:02
Originariamente inviato da franzauker
il primo è C++, il secondo C



#include <iostream>

using namespace std;


Mi sa di no...

Alex'87
10-01-2011, 20:40
Originariamente inviato da Ippo343


#include <iostream>

using namespace std;


Mi sa di no... Credo che intendesse dire che i reference si usano in C++ mentre i puntatori è più "roba da C".

lolide
10-01-2011, 20:51
Originariamente inviato da Alex'87
Credo che intendesse dire che i reference si usano in C++ mentre i puntatori è più "roba da C".

Ah questa non la sapevo

La differenza è la comodità.
Passando un puntatore ogni volta che vuoi il valore devi dereferenziarlo con l'operator*. Invece tramite reference è come se avessi una variabile normale, di cui puoi prenderne il valore senza usare *

bubino91
10-01-2011, 22:39
Ciao ti dirò che se stiamo parlando di c++ (in questo forum pieno di linguaggi si fa sempre un po confusione, è come una torre di Babele!) l'effetto generato è identico: il passaggio per riferimento o per indirizzo (che semanticamente parlando sono la stessa identica cosa), ovvero il primo da te postato (quello che aveva delle ampersand (&) prima deigli identificatori dei parametri effettivi), ha lo stesso identico effetto di quando tra gli argomenti utilizzi dei puntatori: in ogni caso stai passando al sottoprogramma degli INDIRIZZI di variabili/ecc... ma mentre nel primo caso il tutto avviene automaticamente(il compilatore invia l'indirizzo che viene acquisito dal sottoprogramma che lavora direttamente sulla variabile del chiamante, ecc...), nel secondo caso devi gestire esplicitamente il passaggio (devi cioè inviare al sottoprogramma un puntatore o un *indirizzo* e quando devi utilizzare i valori in esso contenuti devi appunto anteporre all'identificatore del puntatore il simbolo *).

simo_85
11-01-2011, 03:59
Originariamente inviato da Alex'87
Credo che intendesse dire che i reference si usano in C++ mentre i puntatori è più "roba da C".
:confused:
In ogni caso, fail..

Ippo343
11-01-2011, 08:31
Originariamente inviato da Alex'87

Ops xD
Beh, aspettiamo l'autore per togliere ogni dubbio. :)

easytechno
11-01-2011, 22:14
comunque sostanzialmente fanno la stessa cosa, ossia quello di agire direttamente sulle locazioni di memoria che contengono le variabili.
la differenza sta più che altrao nella comodità, così ogni volta che farai la chiamata della funzione non dovrai anteporre & agli argomenti e poi... durante la definizione della funzione (cioè nel suo corpo) non rischi di pasticciare con variabili e puntatori ma gestirai gli identificatori tutti nella stessa maniera, trattandole come normali nomi di variabili (ovviamente ti ho dato una spiegazione poco formale ma.. veritiera).

Loading