PDA

Visualizza la versione completa : [C] puntatori,strutture.. copia o no??


thesalien
09-02-2005, 00:05
Salve a tutti,
vorrei avere qualche informazione a proposito dei puntatori alle strutture, come i puntatori alle liste..

Ad esempio, data questa struttura:

typedef struct list_node *list_pointer;
typedef struct list_node {
int chiave;
list_pointer link;
}lista;

list_pointer lista;

se lista fosse una lista con 10 elementi ad esempio e io poi dichiarassi in seguito questo:

list_pointer x = lista; y = lista; z = x;

cosa succederebbe se io modificassi qualche elemento di x?
modificherebbe anche la lista originale??
o lista (la lista originale) non verrebbe modificata per il fatto che x è una copia di lista? e y, viene modificata lo stesso?

e per z? se modifico z, verra modificato anche x e lista?

:confused: :confused: :confused: :confused: :confused: :confused:

grazie in anticipo

:ciauz:

anx721
09-02-2005, 01:24
La regola generale è la seguente: se hai due variabili a e b e fai

a = b;

ad a viene assegnata una copia di b, quindi se modifichi a, il valore di b resta invariato.

Questo pero non deve trarti in inganno nel caso dei puntatori...perche se a e b sono puntatori a strutture, come nel caso delle liste, la regola sopra afferma che il valore della variabile puntatore b viene copiato nella variabile a: ma il valore di b non è il valore della struttura, ma l'indirizzo a cui punta b. In sostanza a e b punteranno alla stessa struttura, quindi se modifichi la struttura puntata da a stai anche modificando la struttura putnata da b perche entrambi puntano alla stessa zona di memoria.

Viceversa, se a e b non sono puntatori a strutture, ma sono strutture esse stesse, con

a = b;

copi tutti i valori di b all'interno di a ottenendo quindi due oggetti separati con gli stessi valori.

thesalien
09-02-2005, 10:42
ciao anx721 e grazie della spiegazione...
ho capito... quindi se a e b fossero puntatori a strutture e lo fossero anche c e d, se io facessi questo:
a = b;

c= b;

d = a;


modificando c, modificherei anche a..giusto?

Whitecrowsrain
09-02-2005, 13:32
Si se crei un solo puntatore succede questo.. ma se crei due o più puntatori alla stessa variabile il risultato che ne verrà fuori non è controllabile...poichè la variabile verrà aggiornata non in tempo reale ma solo quando verra distrutto il puntatore..quindi se crei due puntatori alla stessa variabile può darsi che producano due risultati diversi(dipende dalle operazioni alla quale li sottoponi) e poi sarebbe difficile stabilire quale sarà l'ultimo risultato che viene aggiornato...


Comunque ti invito a leggerti qualcosa in merito perchè l'uso dei puntatori è alla base della programmazione!

E poi ti invito anche a informarti sui riferimenti che sono molto più comodi da usare!!!!

buono studio!

:ciauz:

anx721
09-02-2005, 13:58
Originariamente inviato da thesalien
ciao anx721 e grazie della spiegazione...
ho capito... quindi se a e b fossero puntatori a strutture e lo fossero anche c e d, se io facessi questo:
a = b;

c= b;

d = a;


modificando c, modificherei anche a..giusto?

la risposta è giusto, anche se è corretto dire "modificando LA STRUTTURA puntata da c modificherei anche la struttura puntta da a, semplicemente perche sono la stessa struttura". Se invece modifichi a come puntatore, modifiche a e basta.

anx721
09-02-2005, 13:59
Originariamente inviato da Whitecrowsrain
Si se crei un solo puntatore succede questo.. ma se crei due o più puntatori alla stessa variabile il risultato che ne verrà fuori non è controllabile...poichè la variabile verrà aggiornata non in tempo reale ma solo quando verra distrutto il puntatore..quindi se crei due puntatori alla stessa variabile può darsi che producano due risultati diversi(dipende dalle operazioni alla quale li sottoponi) e poi sarebbe difficile stabilire quale sarà l'ultimo risultato che viene aggiornato...

Questo non è vero...non so cosa te intendi dire...quando si aggiorna una variabile la si aggiorna e basta...

thesalien
09-02-2005, 15:45
Si ho capito, sono la stessa struttura perchè questi puntatori puntano tutti all'indirizzo di a.
Whitecrowsrain, raccolgo il tuo invito alla lettura e all'approffondimento anche se non ho capito ora chi abbia ragione tra voi due :dottò:

anx721
09-02-2005, 16:08
Originariamente inviato da thesalien
anche se non ho capito ora chi abbia ragione tra voi due :dottò:

io :D

thesalien
09-02-2005, 16:13
spero che abbia raggione tu... almeno cosi ho capito :fighet:

Whitecrowsrain
09-02-2005, 18:15
Vabbhe quello che intendevo dire va un po' al di la della domanda che hai fatto..quindi per non confonderti le idee ti dico che quando crei un puntatore ad una struttura non hai fatto una copia ma stai utilizzando la struttura stessa...

cmq quello che hai scritto non funziona!!

xkè se a e b fossero due puntatori a strutture e c e d lo fossero lo stesso :

a = b ; la struttura puntata da a assume il valore della struttura puntata da b;

c = b ; la struttura puntata da c assume il valore della struttura puntata da b;

d = a ; la struttura puntata da d assume il valore della struttura puntata da a;

ora a,b,c,d hanno lo stesso contenuto...ma puntano a strutture diverse quindi se modifichi c modificherai solo la struttura al quale punta c e non a!!! :rollo:
SPERO KE TUTTO QUESTO TI ABBIA CHIARITO LE IDEE....

CIAO CIAO

E STUDIAAA! :ciauz:

Loading