[英]Void Pointers In C
我是C編程的初學者,現在正在學習Pointers的概念。 這是我的代碼->>
`#include<stdio.h>
int main()
{
char t='s';
int a=10;
float s=89;
void *ptr;
ptr =&s;
printf("%c\t",*((char*)ptr));
printf("%d\t",*((int*)ptr));
printf("%f\t",*((float*)ptr));
return 0;
}`
我的問題是,當我引用一個指向浮點數的空指針指向Char時,為什么輸出為空白,而對於整數則為1118961664。字節和體系結構!
通常, float s
變量長4個字節,其值(89)以IEEE 754格式表示。 為了簡單起見,讓我們假設這一點。
第一個printf(char)將使用原始float變量s
的第一個字節(因為一個C char = 1個字節)。 在這里,第一個字節是指位於float s
的4個字節中最低存儲位置的字節。 是的,這取決於機器的字節對齊方式。 輸出很可能是空白的,因為第一個字節對應於一個ascii控制字符(例如0)。
第二個printf(假設int在您的機器/編譯器中長4個字節)將與第三個printf占用相同的4個字節,但將它們打印為整數(請注意,整數與IEEE 754浮點數之間的區別)。 事實證明,IEEE 754的89表示形式對應於“ 1118961664”整數。 這也將取決於字節對齊。
第三個printf做正確的事,它將使用存儲s的值(89)的字節,並將其解釋為浮點數。 它應該打印89.0。 這不取決於字節對齊。
如果浮點數的大小或表示形式不同,則細節將發生變化(多少字節來自何處以及第二個printf打印多少個數字),但行為將相似。 還要注意,原則上前兩個printf調用具有未定義的行為。
浮點數(即float類型)占用4個字節。 在此表達式*((char*)ptr))
中,s的第一個字節被解釋為字符。 在表達式*((int*)ptr))
,如果sizeof(int)等於4,則將s的所有四個字節解釋為一個整數。
由於float和int的內部表示形式不同,因此得到的結果也不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.