Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo
Il più recente robot per la pulizia domestica di Dreame, modello Aqua10 Ultra Roller, abbina un potente motore di aspirazione della polvere a un sofisticato sistema di lavaggio con rullo integrato. Il tutto governato dalla logica di intelligenza artificiale, per i migliori risultati
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti
Siamo volati fino a Belfast, capitale dell'Irlanda Del Nord, per scoprire il nuovo Realme 15 Pro 5G Game Of Thrones Limited Edition. Una partnership coi fiocchi, quella tra Realme e HBO, un esercizio di stile davvero ben riuscito. Ma vi raccontiamo tutto nel nostro articolo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo
Il Gigabyte Gaming A16 offre un buon equilibrio tra prestazioni e prezzo: con Core i7-13620H e RTX 5060 Laptop garantisce gaming fluido in Full HD/1440p e supporto DLSS 4. Display 165 Hz reattivo, buona autonomia e raffreddamento efficace; peccano però le USB e la qualità cromatica del pannello. Prezzo: circa 1200€.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 28-11-2013, 19:00   #1
theUser
Member
 
Iscritto dal: Jul 2007
Messaggi: 108
[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.
theUser è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2013, 20:16   #2
Oceans11
Senior Member
 
L'Avatar di Oceans11
 
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
Quote:
Originariamente inviato da theUser Guarda i messaggi
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:
Codice:
int v[3];
v e &v sono equivalenti e valgono l'indirizzo di memoria del primo elemento dell'array.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes]
"Pirating software? Choose Microsoft!"
Oceans11 è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2013, 20:25   #3
bancodeipugni
Senior Member
 
L'Avatar di bancodeipugni
 
Iscritto dal: Nov 2013
Città: Nel cuore dell'8 Mile di Detroit
Messaggi: 3793
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
bancodeipugni è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2013, 12:05   #4
theUser
Member
 
Iscritto dal: Jul 2007
Messaggi: 108
Pensavo che "&array" fosse un puntatore al puntatore "array".
Se mi dite che le due scritture sono equivalenti è tutto chiaro.
theUser è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2013, 12:11   #5
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da theUser Guarda i messaggi
Pensavo che "&array" fosse un puntatore al puntatore "array".
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)
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2013, 12:22   #6
theUser
Member
 
Iscritto dal: Jul 2007
Messaggi: 108
Questo tutto chiarissimo, grazie.
&v invece restituisce v? E' un'eccezione oppure ho capito male?
theUser è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2013, 13:18   #7
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da theUser Guarda i messaggi
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....ays.JPG?psid=1

Ultima modifica di vendettaaaaa : 29-11-2013 alle 13:59.
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 30-11-2013, 12:06   #8
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da vendettaaaaa Guarda i messaggi
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....ays.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
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 30-11-2013, 18:20   #9
theUser
Member
 
Iscritto dal: Jul 2007
Messaggi: 108
Sono un po' ignorante di questioni sulla memoria
Qualcuno può consigliarmi un link a proposito?
theUser è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Recensione Realme 15 Pro Game Of Thrones: un vero cimelio tech per pochi eletti Recensione Realme 15 Pro Game Of Thrones: un ver...
GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Laptop insieme per giocare al giusto prezzo GIGABYTE GAMING A16, Raptor Lake e RTX 5060 Lapt...
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Atari rilancia Intellivision Sprint e fa...
Leapmotor lancia in Italia il SUV elettr...
QNAP punta sempre più in alto con...
Scandalo ibride plug-in: consumano come ...
L'intelligenza artificiale fa sempre pi&...
Oracle dal punto di vista dell’Europa: l...
James Dyson Award 2025: dall'accessibili...
Xiaomi: gli smartphone con display poste...
Final Fantasy 7 Remake Part 3 offrir&agr...
Chery presenta Omoda 4, da benzina a ele...
TSMC alza i prezzi: Qualcomm e MediaTek ...
Una Offline Room per aiutare gli student...
Partnership EOLO-Qualcomm: connettivit&a...
Fanatec senza freni: ufficiali il nuovo ...
Instagram, arriva la classificazione PG-...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:34.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v