2012-09-28 14 views
10

In che modo gli identificatori %p e %Fp funzionano nel seguente codice?% p Identificatore di formato in c

void main() 
{ 
    int i=85; 

    printf("%p %Fp",i,i); 

    getch(); 
} 

sto ottenendo l'O/P come 0000000000000055 0000000000000055

+0

funzionando come dovrebbe essere, puntatore e galleggiante, qual è il problema? – halfelf

risposta

16

Se questo è quello che chiedete,% pe% Fp stampare un puntatore, in particolare l'indirizzo al quale il puntatore si riferisce, e dal momento che sta stampando una parte dell'architettura del tuo computer, lo fa in esadecimale.

In C, è possibile eseguire il cast tra un puntatore e un int, poiché un puntatore è solo un numero di 32 o 64 bit (a seconda dell'architettura della macchina) riferito al suddetto blocco di memoria.

E, naturalmente, 55 in esadecimale è 85 in decimale.

+1

% Fp non è per il puntatore, a seconda dei compilatori. Per gcc/clang,% F è per float, simile a% f con una piccola differenza. Il seguente 'p' sarà trattato come un normale carattere da stampare. – halfelf

+0

hmm, allora perché sta ricevendo 000 .... 55 due volte e no p? (sono d'accordo con te, come ho appena eseguito da solo) –

1

% p è per la stampa di un indirizzo di puntatore.

85 in decimale è 55 in esadecimale.

Sui puntatori di sistema sono a 64 bit, quindi la rappresentazione completa esadecimale è: 0000000000000055

2

Ecco l'output di compilazione dalla mia macchina:

format.c: 7: 5: avvertimento: formato '% p' ​​si aspetta argomento di tipo 'void *', ma l'argomento 2 ha tipo 'int' [ -Wformat]

format.c: 7: 5: avvertimento: formato '% F' si aspetta argomento di tipo 'doppio', ma l'argomento 3 è di tipo 'int' [-Wformat]

quindi ci sono avvertimenti ma si compila e l'output è: 0x55 0,000000p

Sono sorpreso che tu non abbia una p alla fine. Sei sicuro che il codice e le corrispondenze di output? Suppongo che non sia impossibile che l'indirizzo di i sia anche 0x0 ... 055..ma qui qualcosa sembra sbagliato.

btw: l'uso tipico% p sarebbe stampare un indirizzo cioè & i anziché int

2

Il suo scopo è quello di stampare un valore di puntatore in un formato attuazione definito. L'argomento corrispondente deve essere un valore void *.

E %p viene utilizzato per stampare l'indirizzo di un puntatore che gli indirizzi dipendono dal nostro bit di sistema.

Problemi correlati