|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
[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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
Codice:
int *puntatore = NULL; miafunzione(&puntatore); Cioe & nn era indirizzo di???
__________________
Gnu/Linux User
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
Re: [C] Passaggio per valore o per riferimento ?
Quote:
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
Codice:
miafunzione(puntatore) Codice:
miafunzione(&puntatore) Codice:
void miafuonzione (int *) |
|
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jun 2001
Messaggi: 19
|
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. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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... |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
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++ ?
Ultima modifica di misterx : 22-02-2004 alle 09:06. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Java fa questo passaggio per valore: void f(int p); f(x); |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
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 |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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)... |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:19.



















