esercizio sui puntatori

Stato
Discussione chiusa ad ulteriori risposte.

naojx

Utente Bronze
14 Febbraio 2011
0
0
0
49
Ciao a tutti ho appena incominciato con i puntatori e ho trovato questo esercizio tra gli appunti:

Codice:
#include<stdio.h>
#include<stdlib.h>

int main(){
	int a = 2; //  è un intero e parte con valore 2
	int *pa = NULL, y = 0; /* il contenuto di indirizzo di pa inizialmente è NULL, la variabile intera 
	y parte da 0 */
	
	pa = &a; // pa punta ad a
	y = *pa; // ora l'indirizzo di pa è contenuto in y
	printf("address of a = 0x%X\n", pa); //stampa a schermo l'esadeciamale di pa
	printf("value of a = %d\n", y); //stampa il valore iniziale di a
	*pa = 5; // l'indirizzo di pa è 5
	printf("value of a = %d\n", a); // il nuovo valore di a 
	system("pause"); //mi mette il programma in pausa per visualizzarlo
	return 0;
}

io l'ho commentato per come l'ho capito io, però non so se va bene.
a scermo su win esce:
address of a = 0x23FF74
value of a = 2
value of a = 5
 
Per funzionare funziona , però credo che tu l' abbia capito male :) ,
Codice:
*pa = 5; // l'indirizzo di pa è 5

Facendo l' assegnazione in questo modo non modifichi l' indirizzo ma modifichi il contenuto della locazione di memoria a cui punta pa (quindi modifichi x) .
Spero di essere stato abbastanza chiaro :D
 
**Credo che abbia fatto un nuovo assegnamento, e dunque quell'indirizzo valeva 5.
Quindi all'indirizzo non bisogna assegnare alcun valore, però non capisco perchè vada 5....

***x? non sarebbe y? :D
 
naojx ha detto:
Credo che abbia fatto un nuovo assegnamento, e dunque quell'indirizzo valeva 5.
Quindi all'indirizzo non bisogna assegnare alcun valore, però non capisco perchè vada 5....
No... non hai capito... l'indirizzo si chiama così perchè è realmente un indirizzo che punta allo spazio di memoria dove risiede il valore di a... in altre parole cambi "indirettamente" il valore di a...
 
è semplice,

<tipo> x è una variabile che contiene un valore di tipo <tipo>
<tipo>* x è una variabile che contiene un valore <tipo>*, (che punta) cioè un indirizzo di un'area di memoria (di una variabile) dedita a contenere un valore di tipo <tipo>
& messo prima di una variabile ritorna l'indirizzo della variabile (può stare solo al secondo membro di un'espressione)
* messo prima del nome di una variabile puntatore (non nella definizione) (es: *var) indica che ci si sta riferendo alla cella puntata dalla variabile, (es: quella che si trova all'indirizzo var)

dunque se dichiari
int *a;
int b;
int *c;

a può contenere solo valori == indirizzi di variabili int
b può solo contenere valori == valori int

dunque queste sono frasi ben formate :
a=&b;
*a=b;
b=*a;
b=&a; (un puntatore è una variabile quindi avrà anche un indirizzo come tutte le variabili) in questo caso l'indirizzo di a viene trattato come un valore intero, b non punta ad a ma vale (int)&a
*c=*a;
c=a;

se dichiari
int **x; //puntatore ad un puntatore ad una variabile int

è corretto dire:
x=&a;
x=&c;
*x=a;
*x=c;
*(*x)=b;
 
(assegna manualmente un valore ad un indirizzo e, ammesso che il compilatore non svanghi i maroni, non ne uscirai + fuori ;) )
 
Cerca "C deferenziamento" su google e avrai tutto ciò di cui hai bisogno.
"*" se non vale come operatore di moltiplicazione è l'operatore di deferenziamento, informati su ciò che fa, fai delle prove e tutto sarà chiaro, spiegarlo è un'impresa, è più facile capirlo imho
 
La cosa è semplice, la confusione deriva dall'overloading dell'operatore * che appunto ha tanti usi diversi.
Non discutero quello legato all'operazione aritmetica di moltiplicazione :

varia tutto in funzione del contesto

- dichiarazione
Codice:
          tipo * variabile;
significa che stai dichiarando una variabile che conterrà l'indirizzo di una locazione di memoria che conterrà un dato di tipo "tipo".
Quindi quando usi l'operatore * in fase di dichiarazione questo è il significato.

- assegnazione

si divide in due casi diversi

se vuoi alterare il valore contenuto nella locazione di memoria IL CUI INDIRIZZO è contenuto nella variabile puntatore allora dovrai scrivere così (faccio sempre riferimento alla dichiarazione di esempio di poco fa...)
Codice:
*variabile = valore;
questo significa che dopo questa instruzione nella locazione di memoria il cui indirizzo si trova in "variabile" andrà scritto il valore "valore".
In questo caso * si chiama operatore di dereference, se non erro.
L'altro tipo di assegnazione altera l'indirizzo e non il valore della locazione di memoria puntata, se scrivi
("variabile" è sempre il puntatore dichiarato prima...)
Codice:
variabile = valore;
modifichi l'indirizzo contenuto in "variabile". Se userai funzioni che restituiscono puntatori dovrai usare questo tipo di assegnazione

es
Codice:
variabile = funzioneCheRestituiscePuntatore();


Spero di essere stato d'aiuto :)
 
Stato
Discussione chiusa ad ulteriori risposte.