2012-09-28 16 views
10

¿Cómo funcionan los especificadores %p y %Fp que funcionan en el siguiente código?% p Especificador de formato en c

void main() 
{ 
    int i=85; 

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

    getch(); 
} 

estoy consiguiendo el O/P como 0000000000000055 0000000000000055

+0

trabajando como debe ser, puntero y flotador, ¿cuál es el problema? – halfelf

Respuesta

16

Si esto es lo que están pidiendo,% py% Fp imprimir un puntero, específicamente la dirección a la que se refiere el puntero, y como está imprimiendo una parte de la arquitectura de su computadora, lo hace en hexadecimal.

En C, puede convertir entre un puntero y un int, ya que un puntero es solo un número de 32 bits o de 64 bits (según la arquitectura de la máquina) en referencia al fragmento de memoria antes mencionado.

Y, por supuesto, 55 en hex es 85 en decimal.

+1

% Fp no es para puntero, según los compiladores. Para gcc/clang,% F es para flotación, similar a% f con una pequeña diferencia. La siguiente 'p' se tratará como una char normal para imprimir. – halfelf

+0

hmm, ¿por qué está recibiendo 000 .... 55 dos veces y no p? (Estoy de acuerdo contigo, ya que solo lo ejecuté yo mismo) –

1

% p es para imprimir una dirección de puntero.

85 en decimal es 55 en hexadecimal.

En sus punteros del sistema son de 64 bits, por lo que la plena representación hexadecimal es: 0000000000000055

2

Aquí está la salida de la compilación de mi máquina:

format.c: 7: 5: advertencia: formato '% p' ​​espera argumento de tipo 'void *', pero el argumento 2 tiene por tipo 'int' [ -Wformat]

format.c: 7: 5: advertencia: formato '% F' espera argumento de tipo 'doble', pero el argumento 3 tiene tipo 'int' [-Wformat]

por lo que no son advertencias pero compila y la salida es: 0x55 0.000000p

Me sorprende que no obtengas una p al final. ¿Estás seguro de que el código y la salida coinciden? Supongo que no es imposible que la dirección de i también sea 0x0 ... 055 ... pero algo parece estar mal aquí.

por cierto: el uso típico de% p sería imprimir una dirección, es decir & i en lugar de un int

2

Su propósito es imprimir un valor de puntero en un formato definido por la implementación. El argumento correspondiente debe ser un valor de void *.

Y %p se utiliza para imprimir la dirección de un puntero, las direcciones dependen de nuestro sistema de bits.

Cuestiones relacionadas