簡體   English   中英

C中的空指針

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

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