Newsgroup: it.comp.lang.c
Titolo: Chi sa spiegarmi questo output?

Compilando ed eseguendo il listato di seguito ottengo un output del genere.
ch00: 0000    &ch00: FFF4
ch01: 0000    &ch01: FFF2
 str: FFE8     &str: FFE8
Come mai l'ultima riga?
_________________________________________________
#include <stdio.h>
int main()
{
 const char *ch00=NULL;
 char *ch01=NULL;
 char str[10]="";
 printf("ch00: %p\t&ch00: %p\n",ch00,&ch00);
 printf("ch01: %p\t&ch01: %p\n",ch01,&ch01);
 printf(" str: %p\t &str: %p\n",str,&str);
 return 0;
}
_________________________________________________
--
Francesco Trotta
http://space.tin.it/computer/ftrotta
Elimina "x_" dal mio indirizzo per mandarmi
un messaggio direttamente

 }
"str" equivale ad un puntatore a str[0], esattamente come &str.
Questo e' una delle tre eccezioni alla regola "un lvalue del tipo
array-di-T decade in un puntatore al primo elemento dell'array" (le
altre due si presentano nell'argomento di sizeof, o quando l'array e'
un'inizializzatore string-literal di un altro array di caratteri).
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

 Come mai l'ultima riga?
Fa parte della differenza fra vettori e puntatori.
Il nome del vettore rappresenta l'address del primo elemento sotto forma
di lvalue non modificabile. Quindi accedere al nome del vettore da un
risultato identico che accedere ad un puntatore, ottieni sempre
l'indirizzo dell'oggetto puntato.
La differenza sta nel fatto che il puntatore E' esso stesso una
variabile, mentre il nome del vettore no. Quindi del puntatore puoi
prenderne l'address (con &ptr) mentre con il nome del vettore non ha
senso. Nel C tentare di accedere all'address di 'str' restituisce str
stesso, ovvero l'address del primo elemento.

senso.
Attenzione pero'.
Dire che non abbia senso e' un errore.
Il fatto che un array sia definito in riferimento ad un determinato tipo di
variabile incide direttamente sulla sua aritmetica, se considerato puntatore al
primo elemento.
Supponendo di definire 
int mio_array[10];
Dire "&mio_array + 5" non significa dire "mio_array + 5".
In entrambi i casi si passa da una forma del tipo "array-of-T" ad una di
"pointer-to-array-of-T" ma nel primo caso quel T e' un array di 10 interi, nel
secondo un intero.
Quindi &mio_array + 5 in realta' equivale a mio_array + 5 * 10.
Provando ad eseguire il programma seguente :
#include <stdio.h>
int main()
{
    int  ivt[10], step = 5 ;
    int  diff1 = ivt + step - ivt ;
    int  diff2 = (int *)(&ivt + step) - ivt ;
     printf(" ivt: %p\tivt  + %d : %p\t(%p - %p) = %d\n",
              ivt, step, ivt + step, ivt + step, ivt, diff1);
     printf(" ivt: %p\t&ivt + %d : %p\t(%p - %p) = %d\n",
              ivt, step, &ivt + step, &ivt + step, ivt, diff2);
     return 0;
}
Si ottiene il seguente output (sulla mia macchina in modalita' protetta) :
 ivt: 8eca8	ivt  + 5 : 8ecbc	(8ecbc - 8eca8) = 5
 ivt: 8eca8	&ivt + 5 : 8ed70	(8ed70 - 8eca8) = 50
Andrea Laforgia
----
I guai ve li andate a cercare : 
quando Bill Gates annuncio' che avrebbe fatto scrivere 
Windows98 a Topo Gigio perche' non gli avete creduto ?

 >senso.
Scusate, mi sono espresso in maniera errata.
In realtà intendevo dire che non ha lo stesso significato.

 }
Nel caso dei puntatori, essi puntano da quanche parte e sono memorizzati
ad un certo indirizzo. Nel caso dell'array invece non c'è nessun
puntatore. L'array è costituito semplicemente dai dieci caratteri e
niente altro. Nella funzione printf esso viene convertito implicitamente
nel puntatore al suo primo elemento e quindi quello che vediamo è
l'indirizzo di quest'ultimo.
EMG
PS. C'è stata una lunga discussione al riguardo qualche tempo fa.

un'inizializzatore string-literal di un altro array di caratteri).
Cosa significa "decade"?
Al momento della dichiarazione di un array non viene allocato un puntatore
costante (il cui identificatore è l'identificatore dell'array) e spazio
sufficiente per la memorizzazione di tutti gli elementi?
Mi è stato introdotto l'identificatore di un array come l'identificatore di
un puntatore costante al primo elemento dello stesso. Una leggerezza? Ne
devo supporre che sarebbe stato più opportuno dire "è possibile considerare
l'identificatore di un array come identificatore di un puntatore costante al
primo elemento?"
Quale "entità" sarebbe allora l'array?
Pongo tutte queste domande perché sembra (a mio modesto parere) che le
definizione di un array come puntatore costante al primo elemento sia quella
più consona alla politica del C. Quale vantaggio avrebbe non implementarlo
in questa maniera?
Spero di non risultare troppo pignolo, ma mi interesserebbe approfondire
l'argomento.


 Quale "entità" sarebbe allora l'array?
Un array, appunto.  E' tutto spiegato nel capitolo 5 del K&R2.  Se hai
difficolta' a capire il concetto, puoi trovare un tutorial per
principianti sul web, sotto 
http://www.netcom.com/~tjensen/ptr/cpoint.htm


in questa maniera?
[vedi sopra]
Andrea Laforgia
---------------