Newsgroup: it.comp.lang.c
Titolo: domanda dichiarazione puntatori

sono corrette entrambe?
int c;
int *p;
c = 4;
p = &c;
int c;
int *p;
c = 4;
*p = &c;
hanno lo stesso significato?
Grazie
    Leonardo

 *p = &c;
Come sopra, dichiari una variabile intero ed una puntatore ad intero, 
assegni un intero alla prima MA poi cerchi di assegnare l'indirizzo 
della prima al valore della seconda (valore che deve essere intero) per 
cui il compilatore ti segnalera` un errore semantico.
-- 
Baci,
Mony


al contenuto di memoria puntato da p associ l'indirizzo di c non il valore 4
ossia il contenuto dell'indirizzo di c.
quindi non e' la stessa cosa
la stessa cosa sarebbe
*p=*&c;
oppure
*p=c;
che sono identiche.


grazie mille!
^_^
 Leonardo

 che sono identiche.
Riferendomi agli esempi sopra presentati e soprattuto ad alcuni passi piů
importanti presi dal libro di testo di informatica - purtroppo sto ancora
studiando - vorrei che mi spiegaste sia il senso pratico sia il senso logico
di quanto scritto qui di sotto:
"Partendo dal presupposto che l'accesso ad ogni variabile in fase di
esecuzione del programma č effettuato attraverso l'indirizzo Lvalue di una
variabile e conoscendo l'utilizzo dell'operatore address of (&) il neofita
di C potrebbe pensare che vi sia una corrispondenza tra le seguenti
espressioni:
            a = 10;
            &a = 10;
Internamente il vostro programma C funziona logicamente secondo la seconda
istruzione ma voi non dovrete mai preoccuparvi di questo in quanto la
sostituzione viene fatta automaticamente dal compilatore.
Il meccanismo interno con cui il C valuta le seguenti espressioni di tipo
puntatore č assai diverso da quanto visto in precedenza:
         int a = 10;
         int* ptr = &a;
         a = 5;
         *ptr = 5;
 nella terza istruzione si ha un accesso diretto alla variabile, ovviamente
secondo i criteri visti nell'esempio precedente, mentre nella quarta si č
aggiunto un livello d'indirezione quindi non č piů sufficiente l'indirizzo
di memoria della variabile a, memorizzato all'interno del puntatore, per
identificare la regione di memoria ad essa associata e quindi risulta
necessario l'operatore di dereference che internamente trasforma il valore
del puntatore nell'Lvalue di a."

 importanti presi dal libro di testo di informatica -
Non ti spiego ne' il senso pratico, ne' il senso logico del passo
ripreso da tu testo di informatica (che libro e' ?) perche', 
onestamente, non l'ho capito neanch'io.
Ti dico solo come stanno le cose, in C.
Innanzitutto, parti dal concetto che una variabile di tipo
puntatore, in C, e' una variabile come tutte le altre.
Bada che non ho detto: un puntatore e' una variabile come 
tutte le altre (come molti affermano), perche', a rigor di
logica, il termine "puntatore" e' per il valore contenuto
nella variabile e non per la variabile stessa.
Difatti, in C, una variabile si dice di tipo intero,
proprio perche' contiene un intero.  Si dice di tipo 
float, perche' contiene un float.  Si dice di tipo 
puntatore a carattere, perche' contiene un puntatore
a carattere, ecc...
Questa distinzione e' importante, perche' in C e' possibile
lavorare con puntatori, intesi come valori e non necessariamente
come variabili.
Il valore che una variabile di tipo puntatore puo' contenere 
e' un indirizzo di memoria (ovvero un puntatore a una zona di
memoria).
Una variabile di tipo puntatore va sempre dichiarata in 
riferimento a un tipo di dato: ci possono essere tipi 
puntatori a interi, puntatori a caratteri, 
puntatori a puntatori, ecc.. ecc..
La dichiarazione di una variabile di tipo puntatore a intero 
si compie, per esempio, nel modo seguente:
int *p;
Ora, sapendo che * e' l'operazione di deriferimento, ovvero
quell'operatore che, agendo su un puntatore, restituisce
il valore puntato; sapendo che & e' l'operazione address-of,
ovvero quell'operatore che, agendo su una variabile, restituisce
il suo puntatore (indirizzo di memoria), qual e' la differenza
tra le espressioni:
p 
&p
*p
?
La prima rappresenta il valore di p, ovvero un puntatore ad
un intero.
La seconda rappresenta l'indirizzo di p, ovvero un puntatore
a un puntatore ad intero.
La terza rappresenta il valore puntato da p, ovvero l'intero
presente alla locazione di memoria contenuta in p.
Questo significa, che se avessi:
int **q; 
cioe', q e' una variabile di tipo puntatore a puntatore a intero,
nel senso che il suo valore e' un puntatore a una locazione di
memoria, in cui e' presente il puntatore a una locazione di
memoria, in cui e' presente un intero, potrei scrivere legalmente:
*q = p;
q = &p;
**q = *p;
Come vedi, con gli operatori * e & puoi giocare come vuoi.
Tornando a p, si ha che le scritture seguenti sono valide;
int i = 5;  /* dichiaro un intero e lo inizializzo */
int *p;
p = &i;
*p = 6;
Spero di non aver aumentato la confusione nella tua testa.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ripreso da tu testo di informatica (che libro e' ?) perche', >
onestamente, non l'ho capito neanch'io.
Non posso fare a meno che ringraziarti per l'aiuto prestatomi.
Comunque, potrebbe darsi che l'autore del libro, a prescindere dalle tue
delucidazioni, volesse sottolineare che dal
punto di vista pratico che due istruzioni di assegnazione
come:
    a = 10;
    *(&a) = 10;
vengano valutate internamente dall'elaboratore nello stesso modo?

 vengano valutate internamente dall'elaboratore nello stesso modo?
Diciamo di si'.
Un compilatore sufficientemente furbo traduce le due istruzioni
con lo stesso codice.
