¿Dónde es útil `% p` con printf?

Después de todo, ambas declaraciones hacen lo mismo …

int a = 10; int *b = &a; printf("%p\n",b); printf("%08X\n",b); 

Por ejemplo (con diferentes direcciones):

 0012FEE0 0012FEE0 

Es trivial formatear el puntero como se desee con %x , entonces ¿hay algún buen uso de la opción %p ?

Ellos no hacen lo mismo. La última instrucción printf interpreta b como unsigned int , que es incorrecto, ya que b es un puntero.

Los punteros y las unsigned int no son siempre del mismo tamaño, por lo que no son intercambiables. Cuando no son del mismo tamaño (un caso cada vez más común, ya que las CPU de 64 bits y los sistemas operativos se vuelven más comunes), %x solo imprimirá la mitad de la dirección. En una Mac (y probablemente en otros sistemas), eso arruinará la dirección; la salida será incorrecta.

Siempre use %p para los punteros.

Al menos en un sistema que no es poco común, no imprimen lo mismo:

 ~/src> uname -m i686 ~/src> gcc -v Using built-in specs. Target: i686-pc-linux-gnu [some output snipped] gcc version 4.1.2 (Gentoo 4.1.2) ~/src> gcc -o printfptr printfptr.c ~/src> ./printfptr 0xbf8ce99c bf8ce99c 

Observe cómo la versión del puntero agrega un prefijo 0x , por ejemplo. Siempre use% p ya que conoce el tamaño de los punteros y la mejor forma de representarlos como texto.

No puede depender de que %p muestre un prefijo 0x . En Visual C ++, no lo hace. Use %#p para ser portátil.

El tamaño del puntero puede ser algo diferente al de int . Además, una implementación podría producir mejor que la simple representación del valor hexadecimal de la dirección cuando use %p .

x es un entero hexadecimal sin signo (32 bits)

p es dirección del puntero

Ver printf en la referencia de C ++ . Incluso si ambos escribieran lo mismo, usaría %p para imprimir un puntero.

Cuando necesite depurar, usar printf con la opción %p es realmente útil. Ves 0x0 cuando tienes un valor NULO.

x se usa para imprimir el argumento del puntero t en hexadecimal.

Una dirección típica cuando se imprime usando %x se vería como bfffc6e4 y la dirección sana impresa usando %p sería 0xbfffc6e4