将指针的值打印到对象
要打印指向对象的指针的值(而不是函数指针),请使用 p
转换说明符。它被定义为仅打印 void
指针,因此要打印出非 void
指针的值,需要将其显式转换(“casted *”)到 void*
。
#include <stdlib.h> /* for EXIT_SUCCESS */
#include <stdio.h> /* for printf() */
int main(void)
{
int i;
int * p = &i;
printf("The address of i is %p.\n", (void*) p);
return EXIT_SUCCESS;
}
Version >= C99
使用 <inttypes.h>
和 uintptr_t
在 C99 或更高版本中打印指针的另一种方法是使用 uintptr_t
类型和 <inttypes.h>
的宏:
#include <inttypes.h> /* for uintptr_t and PRIXPTR */
#include <stdio.h> /* for printf() */
int main(void)
{
int i;
int *p = &i;
printf("The address of i is 0x%" PRIXPTR ".\n", (uintptr_t)p);
return 0;
}
从理论上讲,可能没有一个整数类型可以保存任何转换为整数的指针(因此 uintptr_t
类型可能不存在)。在实践中,它确实存在。功能指针不能转换为 uintptr_t
类型 - 尽管它们通常也是可转换的。
如果存在 uintptr_t
类型,则 intptr_t
类型也存在。目前尚不清楚为什么你想要将地址视为有符号整数。
Version < C89
预标准历史:
在 K&K-C 期间的 C89 之前,没有类型 void*
(也没有头文件 <stdlib.h>
,也没有原型,因此没有 int main(void)
表示法),所以指针被投射到 long unsigned int
并使用 lx
长度修改器/转换说明符打印。
以下示例仅供参考。现在这是无效的代码,很可能会引发臭名昭着的 Undefined Behavior
#include <stdio.h> /* optional in pre-standard C - for printf() */
int main()
{
int i;
int *p = &i;
printf("The address of i is 0x%lx.\n", (long unsigned) p);
return 0;
}