2012-09-11 57 views
1

到目前爲止,要打印出指針(地址)的值,(正確或不正確)使用了格式說明符%u。這方面,%p說明符是什麼意思?它打印出的指針值只有void*類型嗎?我試過這個%p說明符來打印出一個整型指針,看起來輸出是十六進制值。 %p來打印整數或字符指針值?請告訴我一些關於%p格式說明符的信息。網絡資源只留下我困惑。我們的意思是「%p格式說明符的參數類型是」void *「?

我已經從以下鏈接來源的問題中的聲明:

http://www.macs.hw.ac.uk/~rjp/Coursewww/Cwww/format.html

+1

其他指針可以隱轉換爲無效指針,但我不確定在C變量函數中應用得如何。 – chris

回答

2

是的,它是用於打印指針所保存的地址。它適用於任何指針類型。

4

%u格式'工作'只要sizeof(void *) == sizeof(unsigned),這通常適用於32位代碼,但不適用於64位代碼。如果你想保持格式的控制(你沒有得到控制的%p外觀),那麼你要使用<inttypes.h>從C99:

printf("0x%.8" PRIXPTR "\n", (uintptr_t)&object); 

宏PRIXPTR提供了正確的長度修改爲uintptr_t類型的值和轉換說明符X。類型uintptr_t是一個足夠大的整數類型來存放任何指針。 .8可確保您至少可以打印8位十六進制數字,但如果地址數量爲64位,並且位數設置爲數值的前32位(最重要),則該位數更多。

嚴格,如果你打算使用%p,則(a)您應確保在棧上的價值實際上是一個void *是鑄造(因爲fprintf()等是可變參數的功能,並不會自動發生轉換) (b)格式沒有跨平臺的標準。它通常相當於小寫十六進制,不帶前綴0x;一些系統會生成前綴0x。在實踐中,你通常會安全通過int *

理論上,在標準C中,沒有辦法打印函數指針;不能保證函數指針與數據指針的大小相同。幸運的是,POSIX步入並聲明在POSIX系統上,函數指針的大小應與數據指針的大小相同。因此,至少在Unix系統上,事實上在Windows系統上,您可以安全地打印數據指針和函數指針。

+0

您可以通過訪問構成「無符號字符」的字節來打印函數指針 - 基本上將它視爲不透明的二進制塊。 – caf

+0

第一句錯誤的假設。使用'%u'格式還假定指針值與整數值存儲在相同的位置。例如,情況並非如此摩托羅拉的68000系列具有專用整數和指針寄存器。 – MSalters

1

void*意思是:「指向內存某處的指針,但我不知道指向哪種內存類型。」這就是爲什麼%p說明符是void*,因爲你不關心類型只有內存地址。它旨在用於打印地址。另一方面,%u預計數據爲unsigned int,雖然這可能在實踐中有效,但有可能void*unsigned int是不同的大小等等,因此不應使用它。此外,如在其他答覆中提到,即使所有指針都轉換爲void*printf和家庭的可變參數的功能在技術上不執行這種轉換,使鑄造void*要做到:

printf("%p", (void*)&x); 
相關問題