PDA

View Full Version : [C] Passaggio per valore o per riferimento ?


misterx
21-02-2004, 18:28
ero convinto che scrivere

int *puntatore = null;


miafunzione(puntatore);

fosse un passaggio per riferimento in quanto passo al chiamante l'indirizzo memorizzato da puntatore

mi dicono invece che è un passaggio per valore :muro:

Luc@s
21-02-2004, 18:30
int *puntatore = NULL;
miafunzione(&puntatore);


Non era cosi???
Cioe & nn era indirizzo di???

recoil
21-02-2004, 18:36
Originariamente inviato da misterx
ero convinto che scrivere

int *puntatore = null;


miafunzione(puntatore);

fosse un passaggio per riferimento in quanto passo al chiamante l'indirizzo memorizzato da puntatore

mi dicono invece che è un passaggio per valore :muro:

tecnicamente è un passaggio per valore, solo che quel valore rappresenta un indirizzo di memoria. è come il discorso di java

VegetaSSJ5
22-02-2004, 00:25
Originariamente inviato da Luc@s

int *puntatore = NULL;
miafunzione(&puntatore);


Non era cosi???
Cioe & nn era indirizzo di???
se vuoi passare il puntatore come argomento devi scriveremiafunzione(puntatore)e nonmiafunzione(&puntatore)a meno che tu non voglia usare un puntatore a puntatore. se passi l'argomento nel primo modo il prototipo deve esserevoid miafuonzione (int *)non so esattamente se passando un puntatore ad una funzione gli passi il valore o un riferimento (cmq credo il valore) fatto sta che usanto un puntatore è come se il passaggio fosse per riferimento visto che puoi tranquillamente i parametri della funzione chiamante.

Joestar
22-02-2004, 03:24
Passando un puntatore ad una funzione si passa un riferimento.

Ipotizzando infatti di passare un puntatore ad una struttura, all'interno della funzione si interagisce con quest'ultima con l'operatore freccia "->" e non con l'operatore punto "." come avverrebbe in caso di passaggio per valore.

es.

struct tag
{
char nome[20];
int eta;
};

struct tag *Ptrdati //creato un puntatore alla struttura di tipo tag

se fz è la funzione in questione il cui prototipo sia per esempio void fz(struct tag *); ecco come le passi il parametro fz(Ptrdati);

All'interno di fz per accedere al campo nome o età si deve usare Ptrdati->nome o Ptrdati->eta o in alternativa (*Ptrdati).nome o (*Ptrdati).eta in questo casosi usa il valore del puntatore.

cionci
22-02-2004, 04:15
void f(int *p); //f opera solo sull'intero (*p)

int x = 0;
f(&x);

Questo io l'ho sempre chiamato passaggio per indirizzo...

Se invece ho una situazione del genere:

void f(int *p, int size); //f opera su un vettore contenuto all'indirizzo p

int *x = new int[n];

f(x, n);

x viene passato per valore. Attenzione, non è il vettore ad essere passato per valore, ma il suo indirizzo di partenza...

Il passaggio per reiferimento in C++ è senza dubbio questo:

void f(int &p); //f opera sull'alias p

int x = 0;
f(x);

p è un alias di x...

Da notare che ai fini della traduzione in assembly, il passaggio per indirizzo e per riferimento si rappresentano allo stesso modo...

misterx
22-02-2004, 08:45
quali sono i motivi che fanno scegliere l'una o l'altra via e cioè passaggio per valore, nel caso di java o C oppure riferimento nel caso di pascal o C++ ?

cionci
22-02-2004, 09:21
Originariamente inviato da misterx
quali sono i motivi che fanno scegliere l'una o l'altra via e cioè passaggio per valore, nel caso di java o C
Java non fa il passaggi per valore dell'indirizzo in quel modo lì...

Java fa questo passaggio per valore:

void f(int p);

f(x);

misterx
22-02-2004, 09:44
Originariamente inviato da cionci
Java non fa il passaggi per valore dell'indirizzo in quel modo lì...

Java fa questo passaggio per valore:

void f(int p);

f(x);


lo avevo capito cionci :)

per definizione l'unico modo che ha java per passare dati tra funzioni(metodi) è per valore e non per riferimento

però stavo chiedendo perchè alcuni linguaggi adottano l'uno l'altro caso

cionci
22-02-2004, 09:57
C++ e Pascal possono adottare tutti i modi citati...
Java non permette il passaggio per indirizzo perchè l'implementazione dei puntatori è nascosta...

Il passaggio per riferimento non viene adottato dal C perchè appunto considerato un doppione del passaggio per indirizzo...

Il passaggio per riferimento è secondo me molto comodo e si adatta perfettamente alla gestione degli oggetti ed all'overloading degli operatori (senza passaggio per riferimento bisognerebbe ammattirci)...