簡體   English   中英

類型轉換char指針到整數指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM