Migliore risposta
Se devi stampare un indirizzo di qualcosa , o il contenuto di una variabile puntatore, lunico modo veramente portabile per farlo è usare lidentificatore di formato\% p. Lo standard C afferma che i caratteri stampati sono definiti dallimplementazione, ma in pratica la maggior parte delle implementazioni della libreria C genera una sequenza di cifre esadecimali che rappresentano lindirizzo.
Gli identificatori di formato\% u e\% x si aspettano un numero intero senza segno e stampa il valore rispettivamente in decimale ed esadecimale. Non si aspettano un indirizzo .
Se usi\% u o\% x (o qualcosa di diverso da\% p) per provare a stampa un indirizzo, potrebbe sembrare funzionare in alcuni ambienti, ma in realtà sarà comportamento non definito e non portatile . Non puoi presumere che la dimensione di un puntatore sia uguale alla dimensione di un numero intero senza segno (o di qualsiasi altro tipo di dati intero). Ad esempio, in molti ambienti a 64 bit, un numero intero senza segno è di 32 bit. Se il numero di bit in un puntatore non corrisponde al numero di bit in un numero intero senza segno nel tuo ambiente e provi a usare\% u o\% x per stampare un indirizzo, otterrai un output errato e loutput dei successivi anche gli elementi nella stessa chiamata a printf potrebbero non essere corretti.
Quindi, se hai intenzione di stampare un indirizzo, usa sempre lidentificatore di formato\% p, per il codice portabile che evita comportamenti indefiniti. Non dare mai per scontato che la dimensione di un puntatore sia la stessa di qualsiasi altro tipo di dati C.
Risposta
Solo \%p
la conversione comprende correttamente un puntatore. La conversione \%p
stampa un puntatore in un modo specifico per limplementazione.
\%u
e sono per i tipi unsigned int
o int
, che possono avere o meno le stesse dimensioni di un tipo di puntatore. La conversione \%u
stampa un numero intero decimale senza segno, mentre \%x
stampa un intero esadecimale senza segno in minuscolo.
A stampa un puntatore con \%u
o \%x
, dovrai trasmettere il puntatore a un int
o unsigned int
. Il cast potrebbe perdere informazioni se sizeof(void *) > sizeof(int)
.
Vedi anche: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s