View Full Version : [C] Passaggio per valore o per riferimento ?
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:
int *puntatore = NULL;
miafunzione(&puntatore);
Non era cosi???
Cioe & nn era indirizzo di???
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.
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.
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...
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++ ?
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);
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
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)...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.