[英]Type casting char pointer to integer pointer
因此,我看到了一些有關如何找到體系結構字節序的示例。 假設我們有一個指向int數據類型的整數指針。 假設int值為0x010A0B12。 在小端序架構中,最低有效字節(即12)將存儲在最低的內存地址中,對嗎? 因此,4字節整數中的最低字節為12。
現在,繼續檢查。 如果我們聲明一個char指針p,然后將整數指針類型轉換為char *並將其存儲在p中,並打印p的取消引用的值,我們將獲得有關體系結構字節序的線索。 如果是12,則我們為小端。 01表示大字節序。 聽起來真的很整潔...
int a = 0x010A0B12;
int *i = &a;
char *p = (char*)i;
printf("%d",*p); // prints the decimal equivalent of 12h!
確實有幾個問題。 由於指針是強類型的,因此字符指針不應該嚴格指向char數據類型嗎? 用%d打印怎么辦? 我們不應該用%c打印字符嗎?
由於指針是強類型的,因此字符指針不應該嚴格指向char數據類型嗎?
C有一個規則,可以將任何指針安全地轉換為char*
和void*
。 因此,可以將int*
轉換為char*
,並且它也是可移植的。 指針將指向int
內部表示形式的起始字節。
我們不應該用
%c
打印字符嗎?
這里還有另外一件事: printf
變長參數列表。 將char
傳遞給printf
的無類型參數時,將應用默認轉換: char
被轉換為int
。 這就是為什么%d
格式可以正確地使用數字,然后按預期方式將其打印出來。
您也可以使用%c
。 處理%c
說明符的代碼將參數讀取為int
,然后將其轉換為char
。 0x12
是一個特殊字符,因此您不會看到統一的打印輸出。
由於指針是強類型的,因此字符指針不應該嚴格指向char數據類型嗎?
這是一種不確定的行為-但是大多數理智的實現都會按照您的意思執行。 因此,大多數人都會同意。
用%d打印怎么辦?
格式%d期望使用int類型的參數,而普通char規則將char類型的實際arg提升為int。 所以這沒關系。 您可能不希望使用%c,因為p指向的字節的內容可以是任何字節,並不總是有效的文本字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.