View Full Version : [C] Passaggio array a funzioni
Sono un po' confuso sull'argomento. Gli array se vengono modificati dalla funzione si devono passare con "&" davanti, giusto? Ma essendo gli array già dei puntatori perchè è necessario? Se poi consideriamo che, almeno con il mio IDE(codeblocks + mingw32, entrambi credo all'ultima versione), non cambia assolutamente niente passando un array come "array" o "&array" la confusione aumenta.
Oceans11
28-11-2013, 20:16
Sono un po' confuso sull'argomento. Gli array se vengono modificati dalla funzione si devono passare con "&" davanti
Che vuol dire?
dato un array, ad esempio:
int v[3];
v e &v sono equivalenti e valgono l'indirizzo di memoria del primo elemento dell'array.
bancodeipugni
28-11-2013, 20:25
cmq tu non passi mai un array a una funzione ma sempre e solo un puntatore al primo elemento di esso
e la stessa cosa vale in uscita: ritorni sempre un puntatore, non un array intero: ergo, i dati scritti in memoria in modo contiguo non vengono mai copiati
Pensavo che "&array" fosse un puntatore al puntatore "array". :doh:
Se mi dite che le due scritture sono equivalenti è tutto chiaro.
vendettaaaaa
29-11-2013, 12:11
Pensavo che "&array" fosse un puntatore al puntatore "array". :doh:
Se mi dite che le due scritture sono equivalenti è tutto chiaro.
In generale &variabile restituisce l'indirizzo di memoria della variabile. Quindi se v è array di int, e gli int occupano 4 byte in memoria, &v[2] restituisce l'indirizzo del primo dei 4 byte che rappresentano il terzo elemento dell'array. &v[2] equivale a &(v[2]), cioè prima ottengo l'elemento v[2] e poi ne prendo l'indirizzo. Vale anche la seguente: &v[2] == (v + 2), così come v[2] == *(v + 2)
Questo tutto chiarissimo, grazie.
&v invece restituisce v? E' un'eccezione oppure ho capito male?
vendettaaaaa
29-11-2013, 13:18
Questo tutto chiarissimo, grazie.
&v invece restituisce v? E' un'eccezione oppure ho capito male?
Credo (ne sono sicuro al 99%, di solito uso il C++ alla C++ e non uso gli array ma i std::vector) sia dovuto alla conversione implicita tra array e puntatore (detto anche "decadimento" da alcuni). Infatti v non sarebbe un puntatore, ma un array. Come si vede nell'immagine, se facciamo la stessa operazione su un puntatore vero e proprio il risultato cambia, perchè in quel caso la variabile puntatore contiene un indirizzo, ma a sua volta è salvata in memoria in un altro indirizzo, nello specifico 4 byte dopo l'altra variabile che sta nella stack, che è proprio l'array dichiarato prima di esso:
https://uqqvkq.bn1302.livefilestore.com/y2pOgfcv6vxJmAKdxfIWCYAGJh4XSk36orDf74nsnh_3UCRkkGcvPMifW5r3TMVpk6-wumwa2Xi4pHYSYBc0UZ0jDWDJLK0GPARF-8nbZlImhU/Pointers%20and%20arrays.JPG?psid=1
vendettaaaaa
30-11-2013, 12:06
Credo (ne sono sicuro al 99%, di solito uso il C++ alla C++ e non uso gli array ma i std::vector) sia dovuto alla conversione implicita tra array e puntatore (detto anche "decadimento" da alcuni). Infatti v non sarebbe un puntatore, ma un array. Come si vede nell'immagine, se facciamo la stessa operazione su un puntatore vero e proprio il risultato cambia, perchè in quel caso la variabile puntatore contiene un indirizzo, ma a sua volta è salvata in memoria in un altro indirizzo, nello specifico 4 byte dopo l'altra variabile che sta nella stack, che è proprio l'array dichiarato prima di esso:
https://uqqvkq.bn1302.livefilestore.com/y2pOgfcv6vxJmAKdxfIWCYAGJh4XSk36orDf74nsnh_3UCRkkGcvPMifW5r3TMVpk6-wumwa2Xi4pHYSYBc0UZ0jDWDJLK0GPARF-8nbZlImhU/Pointers%20and%20arrays.JPG?psid=1
Guardando la figura di nuovo e ripensandoci, v == &v perchè i built-in array devono necessariamente essere dimensionati a compile time, visto che vengono allocati nella stack. Quindi l'indirizzo del puntatore al primo elemento (&v) coincide con l'indirizzo del primo elemento (v, o &v[0]). La cosa non vale nell'altro caso perchè il compilatore sa che nella stack deve allocare memoria per un puntatore ad intero (int* p nel mio caso) ma l'oggetto puntato viene creato solo a runtime nella heap e quindi indirizzo del puntatore (&p) e indirizzo del primo elemento (p, o &p[0]) non coincidono. Ci vorrebbe un disegnino per spiegarsi meglio :D
Sono un po' ignorante di questioni sulla memoria :fagiano:
Qualcuno può consigliarmi un link a proposito?
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.