|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
[c++] passaggio array riferimento
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'& ? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
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
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
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 |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
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. |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
Inviato dal mio GT-I9003 usando Tapatalk |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
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. Codice:
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; } Nel caso degli array classici (quelli del C per capirci) chiaramente hai sempre un passaggio "per puntatore". Quote:
![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
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! Ultima modifica di [Kendall] : 18-11-2012 alle 10:05. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
edit: scusate doppio
Ultima modifica di [Kendall] : 18-11-2012 alle 10:06. |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
Quote:
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/...pass-by-value/ Ribadisco: ciò che suggerisci non può essere assolutamente una regola generale. Ultima modifica di WarDuck : 18-11-2012 alle 17:02. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:38.