Quelle est la différence entre %d
et %u
lors de l'impression des adresses de pointeurs?
Par exemple:
int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"
Vous pouvez trouver une liste des échappements de formatage sur cette page .
%d
est un entier signé, tandis que %u
est un entier non signé. Les pointeurs (lorsqu'ils sont traités comme des nombres) ne sont généralement pas négatifs.
Si vous voulez réellement afficher un pointeur, utilisez le %p
spécificateur de format.
% u imprime un entier non signé
% d imprime un entier signé
pour obtenir une adresse de pointeur, utilisez % p
Voici la liste complète des échappements de formatage. Je donne juste une capture d'écran de cette page
Si je comprends bien votre question, vous avez besoin de %p
pour afficher l'adresse utilisée par un pointeur, par exemple:
int main() {
int a = 5;
int *p = &a;
printf("%d, %u, %p", p, p, p);
return 0;
}
produira quelque chose comme:
-1083791044, 3211176252, 0xbf66a93c
% u est utilisé pour un entier non signé. Étant donné que l'adresse mémoire donnée par l'opérateur d'adresse entière signée% d est -12, pour obtenir cette valeur en entier non signé, le compilateur renvoie la valeur entière non signée pour cette adresse.
La différence est simple: ils provoquent l'émission de différents messages d'avertissement lors de la compilation:
1156942.c:7:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("memory address = %d\n", &a); // prints "memory add=-12"
^
1156942.c:8:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("memory address = %u\n", &a); // prints "memory add=65456"
^
Si vous passez votre pointeur en tant que void*
et utilise %p
comme spécificateur de conversion, vous n'obtenez aucun message d'erreur:
#include <stdio.h>
int main()
{
int a = 5;
// check the memory address
printf("memory address = %d\n", &a); /* wrong */
printf("memory address = %u\n", &a); /* wrong */
printf("memory address = %p\n", (void*)&a); /* right */
}