|
|
|
![]() |
|
Strumenti |
![]() |
#21 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
il passaggio per riferimento dipende, secondo me, dalla semantica degli operatori. In C ci sono operatori che operano sul contenuto di un'area di memoria sovrascrivendolo, un oggetto in Java non viene sovrascritto, è il riferimento che viene modificato per puntare a un oggetto diverso a sto punto domando: in C, quando passo un puntatore, sto usando il passaggio per valore (del puntatore) o per riferimento? PS: please, avvertitemi se ho scritto vaccate PPS: ma PGI-Bis che fine ha fatto? Ultima modifica di mad_hhatter : 16-01-2008 alle 17:54. |
|
![]() |
![]() |
![]() |
#22 | |
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
Quote:
è molto strano che un prof non faccia accenno a una cosa di questo tipo...almeno per quanto ho fatto io finora, all'università sono passato prima per il C poi per il java, ed è stata una delle prime cose che mi hanno insegnato... molto strano anche che neppure ll libro ne parli
__________________
![]() |
|
![]() |
![]() |
![]() |
#23 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
In effetti è un pezzo che non si vede...
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#24 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
facciamo allora un altro esperimento: se in C passo a una funzione un puntatore e la funzione modifica il valore della variabile che lo rappresenta localmente ad essa, la modifca ha effetti sull'area di memoria identificata dal puntatore? direi di no. la modifica si propaga al chiamante? il che è equivalente a chiedere: in C un puntatore viene passato per valore? non conosco affatto bene il C, quindi aspetto risposte, non ho fatto domande retoriche ![]() |
|
![]() |
![]() |
![]() |
#25 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
[controllate se ho commesso errori... è da tempo che non scrivo più codice in C] Codice:
// dichiarazione funzione void changeValue(int*); --- ... --- // definizione funzione void changeValue(int* pointer) { *pointer = 10; } --- ... --- // utilizzo int i = 6; int *pi = i; printf("i vale %d", i); // stampa: i vale 6 changeValue(pi); printf("i vale %d", i); // stampa: i vale 10 Non so se questo risponde alla tua domanda. Codice:
// dichiarazione funzione void changeAddress(int*); --- ... --- // definizione funzione void changeAddress(int* pointer) { pointer += 4000; } --- ... --- // utilizzo int i = 6; int *pi = i; printf("i vale %d", i); // stampa: i vale 6 printf("pi vale %p", pi); // stampa: pi vale [indirizzo memoria corrispondente a i] changeAddress(pi); printf("i vale %d", i); // stampa: i vale 6 printf("pi vale %p", pi); // stampa: pi vale [indirizzo memoria modificato] @EDIT: ho scritto il post "a rate" ![]() Ultima modifica di banryu79 : 17-01-2008 alle 10:04. |
|
![]() |
![]() |
![]() |
#26 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
che succede se modifico il contenuto della variabile che contiene l'indirizzo di memoria? |
|
![]() |
![]() |
![]() |
#27 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
|
|
![]() |
![]() |
![]() |
#28 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
e comunque il tutto dipende dalla semantica degli operatori di assegnamento |
|
![]() |
![]() |
![]() |
#29 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
no in realtà dipende dalla semantica del passaggio dei parametri. nel passaggio per riferimento non succede quello che succede in java
|
![]() |
![]() |
![]() |
#30 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
poi dipende dalla prospettiva: un oggetto in Java non è passato per valore, ma per riferimento... il suo riferimento è passato per valore... Ultima modifica di mad_hhatter : 17-01-2008 alle 11:02. |
|
![]() |
![]() |
![]() |
#31 | |
Senior Member
Iscritto dal: Aug 2006
Messaggi: 1192
|
Quote:
![]()
__________________
blue_blue: nickname proprio di persona, femminile, singolare "Wait, before you close the curtain/There’s still another game to play/And life is beautiful that way"(Beautiful that way, Noa & Nicola Piovani) Fiore, sei un mito ![]() |
|
![]() |
![]() |
![]() |
#32 | |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Quote:
![]() Un riferimento a un oggetto viene passato per valore, su questo non si discute, qui si discute sul passaggio dell'oggetto vero e proprio
__________________
|Java Base| |
|
![]() |
![]() |
![]() |
#33 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
in un passaggio per riferimento la modifica sarebbe visibile anche fuori dal metodo |
|
![]() |
![]() |
![]() |
#34 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
giusto? |
|
![]() |
![]() |
![]() |
#35 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
![]() ![]() |
|
![]() |
![]() |
![]() |
#36 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
![]() per farla breve: JAVA: - tipi primitivi: passaggio per valore - oggetti: passaggio per copia del valore del riferimento (il che equivale a passare l'oggetto in sè per riferimento) PUNTATORI in C: il passaggio NON avviene per copia del loro valore, ma tramite indirizzamento indiretto (altrimenti la loro modifica all'interno di un metodo non avrebbe scope globale) C: il passaggio di un'area di memoria tramite puntatore è un passaggio per riferimento, alla stregua del passaggio di un oggetto in java. la differenza è che in C il puntatore stesso è passato per riferimento corretto? |
|
![]() |
![]() |
![]() |
#37 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
Quote:
in java gli oggetti sono delle variabili che contengono un riferimento a un'area di memoria, quindi questo riferimento viene passato per valore. in C la cosa è equivalente con i puntatori. per convincertene prova a eseguire questo codice: Codice:
#include <stdio.h> #include <stdlib.h> void foo(int* number) { int* anotherNumber = (int*)malloc(sizeof(int)); (*anotherNumber) = 4; number = anotherNumber; } int main(int argc, char* argv[]) { int* number = (int*)malloc(sizeof(int)); (*number) = 1; foo(number); printf("\n%d\n", (*number)); return EXIT_SUCCESS; } |
|
![]() |
![]() |
![]() |
#38 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7257
|
aggiungo che la credenza che il C abbia il passaggio per riferimento è fonte di innumerevoli errori
|
![]() |
![]() |
![]() |
#39 |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
permettimi: se passi un puntatore a un metodo in C e ne modifichi il valore e tale modifica risulta globale allora il puntatore non può essere stato passato per valore, altrimenti avresti un comportamento alla java in cui modificando il riferimento a un oggetto all'interno di un metodo non modifca affatto gli altri riferimenti all'oggetto stesso
|
![]() |
![]() |
![]() |
#40 | |
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
non confondere l'oggetto con il suo riferimento! |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:17.