Meilleure réponse
Si vous avez besoin dimprimer une adresse de quelque chose , ou le contenu dune variable de pointeur, la seule façon vraiment portable de le faire est dutiliser le spécificateur de format\% p. Le standard C stipule que les caractères imprimés sont définis par limplémentation, mais en pratique, la plupart des implémentations de la bibliothèque C génèrent une séquence de chiffres hexadécimaux représentant ladresse.
Les spécificateurs de format\% u et\% x attendent un entier non signé et imprimez la valeur respectivement en décimal et hexadécimal. Ils nattendent pas dadresse .
Si vous utilisez\% u ou\% x (ou tout autre élément que\% p) pour tenter de imprimer une adresse, elle peut sembler fonctionner dans certains environnements, mais sera en fait comportement indéfini et non portable . Vous ne pouvez pas supposer que la taille d’un pointeur est la même que la taille d’un entier non signé (ou de tout autre type de données entier). Par exemple, dans de nombreux environnements 64 bits, un entier non signé est 32 bits. Si le nombre de bits dun pointeur ne correspond pas au nombre de bits dun entier non signé dans votre environnement et que vous essayez dutiliser\% u ou\% x pour imprimer une adresse, vous obtiendrez une sortie incorrecte et la sortie des Les éléments dans le même appel à printf peuvent également être incorrects.
Donc, si vous allez imprimer une adresse, utilisez toujours le spécificateur de format\% p, pour un code portable qui évite un comportement indéfini. Ne supposez jamais que la taille dun pointeur est la même que celle de tout autre type de données C.
Réponse
Seul le \%p
la conversion comprend correctement un pointeur. La conversion \%p
imprime un pointeur dune manière spécifique à limplémentation.
Les \%u
et \%x
les conversions concernent les types unsigned int
ou int
, qui peuvent ou non avoir la même taille quun type de pointeur. La conversion \%u
imprime un entier décimal non signé, tandis que \%x
imprime un entier hexadécimal non signé en minuscules.
À imprimer un pointeur avec \%u
ou \%x
, vous devrez convertir le pointeur en int
ou unsigned int
. Cette distribution peut perdre des informations si sizeof(void *) > sizeof(int)
.
Voir aussi: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s