簡體   English   中英

在C中使用指針進行類型轉換

[英]Type casting with pointers in C

以下類型轉換是否在內存中創建新變量? 在下面的printf函數中引用了它,並打印了1.23作為答案。

#include<stdio.h>
int main(){
    int num;
    num = 1.23456;
    printf("num = %.2f \n", (float)num);
    *((float*) &num) = 1.23456;
    printf("num = %.2f \n", *((float*)&num));
    return 0;
}
num = 1.23456;

num的值設置為1。(小數部分.23456被丟棄,因為根據C語言規則,int無法容納小數)

*((float*) &num) = 1.23456;

在這里,您將采用浮點值1.23456並覆蓋num駐留在該位模式下的內存位置。 我懷疑這是在引起未定義的行為; 在任何情況下,它只能在sizeof(float)== sizeof(int)的計算機上“工作”,所以這樣做不是一個好主意。

printf("num = %.2f \n", *((float*)&num));

在這里,您假裝num所在的內存位置實際上是一個浮點位置,並打印出該內存,就好像它是一個浮點值一樣。 恰好在您的計算機上完成了您期望的操作,但是您不應依賴它這樣做。 通過像這樣棘手的轉換和類型調整,您可以有效地“落后於編譯器”並繞過其類型系統。 這可能會咬你(即使在float和int都占用相同字節數的計算機上)也可能會咬你,這是在啟用優化功能時,編譯器以某種方式優化了代碼,並假設int和float不占用內存中的地址相同 -但是您的代碼故意破壞了這一假設,因此您的程序最終執行了意外的操作(例如崩潰或打印出錯誤的值)。

以下類型轉換是否在內存中創建新變量?

C是一種相當低級的語言(無論如何按照現代的標准),它正在嘗試執行您的程序告訴它的操作,沒有更多也沒有更多。 特別是,您的程序告訴它將指向int的指針視為指向浮點的指針,並且C編譯器相信您知道自己在做什么,並通過使用強制轉換來違反類型系統。 因此,該程序並沒有在內存中創建新變量,而是以一種可疑且不安全的方式覆蓋了現有變量( num )所在的內存字節。

這里的主要思想是,當您強制轉換為浮點指針並將值寫入內存時:

*((float*) &num) = 1.23456;

編譯器將值寫入內存,就好像它是浮點型一樣。 因此,實際上,您將在應該存儲int的位置存儲了一個float,這通常是不允許您執行的。 因此,當您將其顯示為浮點數時:

printf("num = %.2f \n", *((float*)&num));

有用。 但是,當您直接將其分配給以下對象后,返回並再次將其顯示為int時:

printf("num = %d \n", num);

您將看到一個不同的值:

num = 1067320848

浮點值的表示形式,顯示為整數1。

請記住,由於浮點數的表示,內部整數和浮點數在存儲位時會有所不同。

當您將變量聲明為整數然后將其初始化為浮點數時,在這種情況下,程序將在后台將其存儲為整數(即​​1),並截斷所有小數位。 應該先聲明為float。

對於指針來說,它顯示為浮點數,因為已將其聲明並初始化為浮點數,並且您正在修改(類型轉換)並在其內存位置顯示值,該值通過引用進行調用。 這意味着數據類型也將改變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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