PDA

View Full Version : [C] Passaggio di parametri nelle funzioni


sharkkk
04-04-2014, 08:39
Salve,

volevo chiedervi, in C il passaggio dei parametri nelle funzioni è solo per valore ed in realtà il passaggio per riferimento è solo simulato è esatto?

ed in C++? (ed in Java visto che ci sono?:D )

lorenzo001
04-04-2014, 09:00
In C il passaggio per riferimento non esiste.

Passi per valore o per indirizzo (tramite un puntatore).

wingman87
04-04-2014, 15:31
Io mi trovo meglio senza fare distinzioni, per me è sempre per valore.
Nel C viene sempre passato il valore dell'espressione che fornisci come argomento. Per fare un esempio in C:

int a=4;
someFun(a) //a contiene 4 quindi passo 4
int* b=&a;
someFun2(b); //b contiene l'indirizzo di a, quindi passo l'indirizzo di a
someFun3(&b); //&b è l'indirizzo di b, quindi passo l'indirizzo di b
...
struct example { int a; int b; };
struct example x;
x.a = 2;
x.b = 5;
someFun4(x); //x contiene i valori 2 e 5, quindi passo 2 e 5 (l'intera struttura viene copiata e passata)
In Java, nel caso di tipi primitivi il valore è effettivamente il valore della variabile (es: 32, 4.76, 'g', false, ecc..), nel caso di oggetti il valore è l'indirizzo dell'oggetto (che poi è ciò che effettivamente la variabile contiene). Quindi alla fine il passaggio è comunque per valore.

In C++ è presente anche il passaggio per riferimento che in sostanza differisce dal passaggio per valore perché ciò che viene passato effettivamente dipende anche da come è dichiarata la funzione/metodo che si va a chiamare.
In pratica dato il seguente codice:
int a = 4;
someFun(a);
non posso inferire che a sia stato passato per riferimento o per valore, devo andare a vedere come è dichiarato someFun
void someFun(int x);
Questo caso è come nel C
void someFun(int& x);
In questo invece la variabile a è passata per riferimento, cioè, di fatto, è come se fosse stato passato l'indirizzo di a ma la dereferenziazione di x venisse effettuata implicitamente (non devi scrivere *x ma solo x).