Après tout, ces deux déclarations font la même chose ...
int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);
Par exemple (avec différentes adresses):
0012FEE0
0012FEE0
Il est trivial de formater le pointeur comme vous le souhaitez avec %x
, y a-t-il donc une bonne utilisation du %p
option?
Ils ne font pas la même chose. Cette dernière instruction printf
interprète b
comme un unsigned int
, ce qui est faux, car b
est un pointeur.
Pointeurs et unsigned int
s ne sont pas toujours de la même taille, ils ne sont donc pas interchangeables. Quand ils ne sont pas de la même taille (un cas de plus en plus courant, car les processeurs 64 bits et les systèmes d'exploitation deviennent plus courants), %x
n'imprimera que la moitié de l'adresse. Sur un Mac (et probablement certains autres systèmes), cela ruinera l'adresse; la sortie sera fausse.
Utilisez toujours %p
pour les pointeurs.
Au moins sur un système qui n'est pas très rare, ils n'impriment pas de la même façon:
~/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
Remarquez comment la version du pointeur ajoute un 0x
préfixe, par exemple. Utilisez toujours% p car il connaît la taille des pointeurs et la meilleure façon de les représenter sous forme de texte.
Vous ne pouvez pas dépendre de %p
affichant un 0x
préfixe. Sur Visual C++, ce n'est pas le cas. Utilisation %#p
pour être portable.
La taille du pointeur peut être différente de celle de int
. Une implémentation peut également produire une représentation de l'adresse hexadécimale meilleure que la simple lorsque vous utilisez %p
.
x
est un entier hexadécimal non signé (32 bits)
p
est l'adresse du pointeur
Voir printf sur la référence C++ . Même si les deux écrivaient la même chose, j'utiliserais %p
pour imprimer un pointeur.
Lorsque vous devez déboguer, utiliser printf avec l'option %p
Est vraiment utile. Vous voyez 0x0 lorsque vous avez une valeur NULL.