将指针的值打印到对象

要打印指向对象的指针的值(而不是函数指针),请使用 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;
}