PDA

Visualizza la versione completa : [C] Puntatori e loro deferenziamento


FinalFantasy
02-03-2007, 15:54
In piccolo dubbio su puntatori

se io ho:

int *ciao;

se voglio modificare il suo valore

*ciao=10;
giusto?

se voglio modificarei l suo indirizzo

ciao=&indirizzo_variabile;

ecco...

se voglio far in modo che un altro puntantore punti alla stessa variabile, che devo fare?

int *p1,*p2;

p1=&var1;

voglio che p2 punti dove punta p1

si fa

p1=p2

o

*p1=*p2

o

p1 = &p2

????

UltraBeginner
02-03-2007, 16:17
Originariamente inviato da FinalFantasy
In piccolo dubbio su puntatori

se io ho:

int *ciao;

se voglio modificare il suo valore

*ciao=10;
giusto?

se voglio modificarei l suo indirizzo

ciao=&indirizzo_variabile;

ecco...

se voglio far in modo che un altro puntantore punti alla stessa variabile, che devo fare?

int *p1,*p2;

p1=&var1;

voglio che p2 punti dove punta p1

si fa

p1=p2

o

*p1=*p2

o

p1 = &p2

????

Ciao Fantasy!! Provo a spiegarmi

p1=p2; // assegna il valore di p2 a p1, in questo modo p1 puntera alla locazione di memoria dove punta p2

*p1=*p2 // in questo modo la variabile puntata da p1 assume lo stesso valore della variabile puntanta da p2

p1 = &p2 // in questo modo p1 deve essere un puntantore a puntatore, in quanto assegni a p1 l'indirizzo del puntatore p2. i puntantori a puntatori possono servire per il passaggio delle liste dinamiche per riferimento, per creare matrici dinamiche, etc

Spero di essere stato utile :)

Saluti!!! :) :ciauz: :ciauz:

donato.sciarra
02-03-2007, 16:22
allora:

un puntatore contiene semplicemente l'indirizzo di una variabile del suo stesso tipo!
Quando crei un puntatore ci poni davanti il carattere di deferimento ( * ) che serve ad indicare al compilatore che quello e' un puntatore!

un puntatore una volta creato nn punta a niente, e' necessario risolvere il riferimento !

Questo riferimento del puntatore va risolto o assegnandoli un indirizzo di una variabile del suo stesso tipo ( quindi con & ) oppure assegnando un puntatore che io chiamo dello stesso livello, diciamo dello stesso grado di deferimento....( detto cosi proprio rozzamente --> assegnando un puntatore con lo stesso numero di ( * ) ) !

ti faccio un esempio...




int *ptr, *punt; /*definisco due puntatori*/

int **super_ptr;/*puntatore di puntatore ad un intero*/

int uno=5;

/*a questo punto ho due puntatori un doppio puntatore ad intero ed un intero.
per far puntare un puntatore alla variabile "uno" gli assegno il suo indirizzo*/

ptr=&uno;

/*a questo punto ptr punta ad uno
- se stampi ptr senza l'operatore ( * ) troverai l'indirizzo contenuto in ptr
- se stampi *ptr inveci ottieni il contenuto della variabile puntata
- se stampi &(*ptr) ottieni l'indirizzo della variabile puntata
*/


/*
mettiamo il caso che tu voglia cambiare il valore della varibile uno indirettamente...poni semplicemente *ptr=valore;
*/

*ptr=50;

/*per far si che il secondo puntatore punti alla stessa cosa a cui punta il primo puoi farlo in due modi o procedi nuovamente con un operazione di assegnamento tramite & oppure un semplice assegnamento tra i due puntatori*/

punt=ptr;

/*in ultimo t mostro un altro esempio*/

super_ptr=&ptr;/*faccio puntatore super_ptr a ptr che a sua volta punta a uno*/

/*vediamo se hai capito
(nn compilarlo prova a ragionarci ! )

- se stampo *super_ptr ( con un solo * ) cosa ottengo a video???

- se lo stampo cosi **supe_ptr( con due)???

- e cosi super_ptr ???

- e cosi &super_ptr ???

*/



dai nn e' difficile. . . .

. . .spero di essere stato chiaro!

donato.sciarra
02-03-2007, 16:27
Originariamente inviato da FinalFantasy

ciao=&indirizzo_variabile;



forse volevi semplicemente dire

ciao=&variabile;

.....

oregon
02-03-2007, 16:35
Originariamente inviato da FinalFantasy
In piccolo dubbio su puntatori

Mi sa che non hai "piccoli" dubbi sui puntatori ...

FinalFantasy
02-03-2007, 16:53
il problema il seguente...
x quando i guarda i puntatori sono quasi ok..
ma quelli ke nn riesco a capire sono i doppi puntatori...

che vuol dire che **ciao un doppio puntatore o un puntatore a un puntatore?

sul mio libro i doppi puntatori credo che non ci stanno...

oregon
02-03-2007, 17:08
Mi dispiace deluderti, ma da quello che hai scritto prima, secondo me, tu hai parecchi dubbi anche sui puntatori semplici ...

Per quanto riguarda i puntatori doppi, anche questo e' un concetto molto semplice. Sono semplicemente dei puntatori a puntatori. Ovvero, se un puntatore contiene l'indirizzo in memoria di un dato, un doppio puntatore contiene l'indirizzo in memoria di un puntatore a un dato.

donato.sciarra
02-03-2007, 17:09
il discorso e' sempre quello. . .

un puntatore consideralo come una variabile che contiene un indirizzo di un'altra variabile! praticamente ha un indicazione su quale area di memoria si trova la variabile a cui punta quindi che contenga l'indirizzo di una varibile "normale" o di un puntatore nn cambia nulla. . .quello a cui devi stare attento e che un doppio triplo quadruplo puntatore puo avere o lo stesso contenuto di un puntatore del suo stesso tipo o l'indirizzo di un puntatore di un grado inferiore o se di primo quello di una variabile "normale".

esempi:

4 deferimenti
****ciao a questo puntatore puoi assegnarci o ****ariciao oppure &(sao)

dove sao e' ad esempio int ***sao;

3 deferimenti
***ciao ci assegni o un altro puntatore con tre deferimenti oppure l'indirizzo di un puntatore con due deferimenti

2 deferimenti
**ciao ci assegni o un puntatore del suo stesso tipo quindi con due deferimenti oppure l'indirizzo di un puntatore con un deferimento.

1 deferimento
*ciao caso piu semplice a cui puoi assegnarci o il contenuto d un altro puntatore allo stesso tipo o l'indirizzo di una variabile "normale"

ovviamente se definisci puntatori con 4 deferimenti questo implica che tu debba definirne almeno uno con 3 con 2 con uno e poi all'ultimo assegnarci una variabile. . .


spero di essere stato esauriente ! :ciauz:

UltraBeginner
02-03-2007, 17:30
Originariamente inviato da oregon
Mi dispiace deluderti, ma da quello che hai scritto prima, secondo me, tu hai parecchi dubbi anche sui puntatori semplici ...

Per quanto riguarda i puntatori doppi, anche questo e' un concetto molto semplice. Sono semplicemente dei puntatori a puntatori. Ovvero, se un puntatore contiene l'indirizzo in memoria di un dato, un doppio puntatore contiene l'indirizzo in memoria di un puntatore a un dato.

Domanda OT: ma nella pratica si usano puntatori di livello superiore a 2? Detto in altri termini puntatori tripli,quadrupli etc che applicazioni potrebbero trovare? Cosi su due piedi userei al limite i puntatori tripli per fare una struttura dati tridimensionale dinamica :confused: :confused: Ma direi che siamo nel campo della fantascienza lol :zizi: :zizi:

LeleFT
02-03-2007, 17:34
Originariamente inviato da UltraBeginner
Domanda OT: ma nella pratica si usano puntatori di livello superiore a 2? Detto in altri termini puntatori tripli,quadrupli etc che applicazioni potrebbero trovare? Cosi su due piedi userei al limite i puntatori tripli per fare una struttura dati tridimensionale dinamica :confused: :confused: Ma direi che siamo nel campo della fantascienza lol :zizi: :zizi:
Beh... prova a pensare ad un array tridimensionale di stringhe...
Applica questo concetto ricorsivamente e ti accorgerai che non poi tutta fantascienza.


Ciao. :ciauz:

Loading