2017-02-22 46 views
2

在C++中指針的轉換是什麼意思?在C++中強制轉換(const char *)指針的含義是什麼?

例如,寫什麼?

爲什麼它會將uint32_t指針轉換爲(const char *)?

class A{ 
     uint32_t a;// initialized by some value 
     void write(ostream& os){ 
        os.write((const char*)&a, sizeof(a)); 
     } 
}; 
+0

通過指針將'uint32_t'鑄造到'char'可能會在小端和大端機器上導致不同的行爲。 – JHBonarius

回答

2

,如果你看一下documentation of ostream::write它可以幫助:

basic_ostream& write(const char_type* s, std::streamsize count); 

表現爲一個UnformattedOutputFunction。 [...]

所以write執行未格式化寫入到流。這意味着沒有文本格式,轉換等(如新行)。爲此,它需要一個字節緩衝區來插入流中。不幸的是,C++沒有byte類型作爲頭等公民。而是使用char。這就是爲什麼要投到const char*

0

這是一些數據結構的序列化。

指針在C++中的轉換是什麼意思?

ofstream::write預計const char* s作爲第一個參數

它爲什麼投uint32_t的指針(爲const char *)?

它將四個字節寫入某個流(一個無符號整數),也許寫入std :: ofstream。這樣它將存儲在a中的值寫入例如一個文件。

0

成員函數write聲明如下方式

basic_ostream<charT,traits>& write(const char_type* s, streamsize n); 

正如你看到它的第一個參數的類型爲const char_type *

在這個調用

os.write((const char*)&a, sizeof(a) 

有使用類型的指針uint32_t *。但是,在C++中不存在從uint32_t *類型到const char_type *類型的隱式轉換。因此,使用了顯式轉換,即嘗試將uint32_t類型的對象寫爲字節序列。

2

指針是存儲內存位置的變量。所以所有的指針都有相同的值範圍(從0到最大支持內存位置的整數)。

現在,指針支持稱爲解引用的操作:訪問存儲在該內存地址的對象。如果你有一個內存地址,並且你想訪問那裏的對象,你需要知道對象的大小(以字節爲單位)以及許多關於如何真正解釋那些值的東西。所有這一切都以這種類型而聞名。所以,我們有不同類型的指針,我們可以在它們之間進行轉換,因爲它們都具有相同的值域。

這意味着通過改變指針的類型可以對同一個對象有不同的解釋。

讓我們回到你的問題。您顯示的寫入函數應逐字節地寫入流(必須處理很多原因,例如字節是存儲的最小單位,因此您可以通過寫入字節來寫入任何內容)。現在,你有一個4字節的int,你想要逐字節訪問。你如何做到這一點?只需獲取一個指針,將其轉換爲字節大小的類型(char),並使用指針算術訪問4個字節(基本訪問4個連續的存儲單元) - 這就是爲什麼您還需要發送類型的大小。作爲預防措施,第一個參數的請求類型爲const char*,以確保它不會更改數據。

現在,在你的情況下,轉換(指針轉換)是明確的。

相關問題