將指標的值列印到物件

要列印指向物件的指標的值(而不是函式指標),請使用 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;
}