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