%d
打印指针地址和打印指针地址有什么区别%u
?
例如:
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"
%d
打印指针地址和打印指针地址有什么区别%u
?
例如:
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"
如果我正确理解您的问题,您需要%p
显示指针正在使用的地址,例如:
int main() {
int a = 5;
int *p = &a;
printf("%d, %u, %p", p, p, p);
return 0;
}
将输出如下内容:
-1083791044, 3211176252, 0xbf66a93c
%u 用于无符号整数。由于有符号整数地址运算符 %d 给出的内存地址为 -12,因此要以无符号整数形式获取此值,编译器会返回此地址的无符号整数值。
区别很简单:它们会导致编译时发出不同的警告消息:
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"
^
如果将指针作为 a 传递void*
并%p
用作转换说明符,则不会收到错误消息:
#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 */
}