Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
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: 3732
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


Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Concept THREE: al salone di Monaco Hyund...
Broadcom in tribunale per VMware: dopo u...
Microsoft integra l'intelligenza artific...
3 portatili con GeForce RTX 5070 che fan...
Sardegna green: milioni per il fotovolta...
Gemini ora supporta anche i file audio p...
Atari Gamestation Go: tastierino numeric...
Microsoft continua a licenziare, mentre ...
Il telescopio spaziale James Webb ha ana...
Quasi tutti gli utenti ChatGPT usano anc...
Windows 95: perché Microsoft non ...
Mappa degli amici su Instagram: i dubbi ...
SpaceX: eseguito lo static fire di Super...
Volkswagen sorprende all'IAA 2025: svela...
Rabbit R1, prove di rinascita dopo il fl...
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: 16:59.


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