簡體   English   中英

不了解空指針/如何施放? (C 編程)

[英]Not Understanding Void Pointer / How to cast? (C Programming)

假設我想編寫一個函數: int read_file (char *filename, void *abc)讀取文件,並將數字放入abc指向的數組中。 我必須使用 void 指針 - 我知道如果它是int *abc而不是 void 我會怎么做,因為我可以在語法上像一個數組一樣對待abc ,並且做像abc[0]=1這樣的事情,但在這里我可以'不要這樣做,因為它是一個空指針。

我對空指針不太熟悉,我應該如何讓它工作。 請幫忙! 我不想發布代碼,因為這是一個學校作業,我只想知道我如何將文件中的信息放入abc指向的數組中,也許使用強制轉換(但不確定如何做)。

我已經熟悉將文件信息放入數組中,如果它是由int abc給出的。

如果始終使用abc參數的int數組調用read_file則可以將其復制到int指針並使用它。

int *p = abc;

在大多數情況下,從一種類型更改為另一種類型時需要強制轉換,但是void *可以在沒有安全轉換的情況下自由轉換為或從任何非函數指針轉換。

在幕后,所有指針都是相同的——它們是代表內存地址的整數。 所以你可以以任何方式投射它們。 去吧:

int *p = (int *)abc;

瞧 - 你有你的int * ,你已經知道如何處理了。 順便說一句,這是“強制轉換”的事情 - 在表達式前面的括號中寫入所需的類型以“強制轉換”它。 它將采用相同的位並以不同的方式重新解釋它們。

在少數情況下,C 實際上足夠聰明來轉換數據,而不是盲目地使用相同的位。 例如:

float f = 3.75;
int i = (int)f;

在這種情況下, i將包含3因為在這種情況下它會向下舍入。 並且int在內存中的存儲方式與float不同,因此這里進行了實際的轉換。

在其他情況下,它會完全禁止你施放,因為它沒有多大意義:

char *c = "Hello, world!";
float f = (float)c;

但很多時候你可以逃脫它。 尤其是三分球,一切都是公平的。 現在,請注意,能力越大,責任越大。 盡管您可以做到,但這並不意味着結果是合理的,並且使用它不會使您的程序崩潰。 當心。

暫無
暫無

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

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