View Full Version : [c++] passaggio array riferimento
mistergks
14-11-2012, 23:31
Toglietemi questo dubbio ragà:
Ho una funzione void...
all'interno di essa modifico un array...richiamando la funzione dal main...quell'array verrà modificato?! o va passato per forza per indirizzo? con l'& ?
Cait Sith
14-11-2012, 23:46
non è che si capisce molto da quello che hai scritto, comunque se passi un array come argomento di una funzione è come se passassi un puntatore al tipo dell'elemento dell'array, quindi non devi usare il & perchè l'array è già un indirizzo di memoria
mistergks
15-11-2012, 00:56
non è che si capisce molto da quello che hai scritto, comunque se passi un array come argomento di una funzione è come se passassi un puntatore al tipo dell'elemento dell'array, quindi non devi usare il & perchè l'array è già un indirizzo di memoria
E invece una variabile intera si.. Ho provato al compilatore..
Ad esempio ho una variabile int x.
Se passo void funzione(&x) me la modifica..altrimenti se passo solo funzione(x) no! Come mai?!
Inviato dal mio GT-I9003 usando Tapatalk
vendettaaaaa
15-11-2012, 01:30
E invece una variabile intera si.. Ho provato al compilatore..
Ad esempio ho una variabile int x.
Se passo void funzione(&x) me la modifica..altrimenti se passo solo funzione(x) no! Come mai?!
Inviato dal mio GT-I9003 usando Tapatalk
Perchè void funzione(x) crea, nel corpo della funzione, una copia di x e lavori su quella. La x originale non viene toccata. Con &x passi un riferimento alla funzione, cioè dici alla funzione "lavora su questa variabile", o meglio "quando assegni un valore a x, salvalo in questa cella di memoria".
Se leggi senza problemi l'inglese, ti consiglio "Accelerated C++" di Koenig e Moo, e soprattutto "Programming: Principles and Practice Using C++" di Stroustrup (il creatore del C++). Meglio il secondo. Spiegano in modo cristallino i concetti basilari della programmazione, come il passaggio per valore, riferimento o puntatore.
mistergks
15-11-2012, 17:14
Perchè void funzione(x) crea, nel corpo della funzione, una copia di x e lavori su quella. La x originale non viene toccata. Con &x passi un riferimento alla funzione, cioè dici alla funzione "lavora su questa variabile", o meglio "quando assegni un valore a x, salvalo in questa cella di memoria".
Se leggi senza problemi l'inglese, ti consiglio "Accelerated C++" di Koenig e Moo, e soprattutto "Programming: Principles and Practice Using C++" di Stroustrup (il creatore del C++). Meglio il secondo. Spiegano in modo cristallino i concetti basilari della programmazione, come il passaggio per valore, riferimento o puntatore.
Ho capito! Invece se è una funzione int posso restituire la x passata per valore!
Inviato dal mio GT-I9003 usando Tapatalk
Quando passi un array semplice ad una funzione, stai passando in realtà il suo puntatore.
Il passaggio dei puntatori avviene (tipicamente) per valore, nel senso che l'indirizzo di memoria viene copiato (sullo stack o nei registri).
Nota bene che il passaggio per riferimento è una cosa un po' diversa, anche se gli effetti sono gli stessi.
void FunzioneRif(Object& o) // passaggio per riferimento
{
o.method();
}
void FunzionePtr(Object* o) // passaggio "per puntatore"
{
o->method();
}
int main(void)
{
Object o;
FunzioneRif(o); // passaggio per riferimento
FunzionePtr(&o); // passaggio "per puntatore"
return 0;
}
Entrambe le funzioni si comportano esattamente nello stesso modo.
Nel caso degli array classici (quelli del C per capirci) chiaramente hai sempre un passaggio "per puntatore".
esatto...io ti consiglio sempre passaggi per riferimento xke ti abiti ore e ore a sclerare solo xke ti dimentichi il return :)
Io vi consiglio di capire SEMPRE cosa state facendo, e non darvi alla "programmazione creativa" ;).
[Kendall]
18-11-2012, 02:40
Hihi, l'orgoglio dei programmatori :-P...
A parte questo ricorda sempre una cosa: il nome di un array, ergo la/le lettere senza le parentesi quadre, nel C++ sono a tutti gli effetti un puntatore alla prima posizione dell'array (per questo utilizzandolo come argomento un array viene passato per riferimento, perchè è a tutti gli effetti un puntatore!
[Kendall]
18-11-2012, 02:41
edit: scusate doppio
ricorda comunque,a parte il fatto dell'orgoglio dei programmatori (XD), ke nel caso di progetti importanti tipo la creazione di motori grafici,kernel ecc... l'allora ione dello spazio è di vitale importanza...quindi avere spazio allocato per un puntatore invece di un intera area di memoria copiata, anche di solo pochi kb, è di cruciale importanza :)
Stiamo parlando del passaggio di parametri ad una funzione e ciò che dici NON E' una regola generale, specialmente in C++.
Basta vedere cosa succede quando passi una std::string per valore, ad esempio.
Inoltre la tua regola non vale ad esempio per gli shared_ptr, dove è auspicabile il passaggio per valore per far si che si incrementi il reference count.
Inoltre suggerisco la seguente lettura:
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
Ribadisco: ciò che suggerisci non può essere assolutamente una regola generale.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.