簡體   English   中英

C++ 類型轉換 int 指針到 void 指針到 char 指針?

[英]C++ Typecast int pointer to void pointer to char pointer?

您好,我對類型轉換指針感到困惑。 我知道 void 可以容納任何類型。

因此,如果我有一個 int *,其中有一個值,那么我對 int * 做了一個 void *,然后我可以將它類型轉換為 char 嗎?

很難解釋我的意思,而且標題可能是錯誤的,但這會起作用嗎?

這樣做是否安全。 我已經看到它在 C 中使用了很多。 這是不好的做法嗎。

int main() {
    int* a = new int{ 65 };
    void* v = static_cast<int*>(a);
    std::cout << *(static_cast<char *>(v));
}

我知道 void 可以容納任何類型。

你理解錯了。 指針不保存數據,它指向它。 So integer pointer points to memory with holds integer, float pointer points where float is etc. Void pointer just points to some memory, but it says - I do not know what kind of data is there.

現在轉換。 從技術上講,您幾乎可以將任何指針轉換為任何指針(有例外,例如 function 指針或指向成員的指針,但它們是完全不同的野獸,這不是您要問的),因為它們都只是指針。 但是當您嘗試訪問它們指向的 memory 時,就會出現問題。 因此,如果您在 memory 中有int並嘗試將其讀取為float ,反之亦然 - 這是非法的。 現在 rte 是一個例外 - 您可以通過指向char (或unsigned char )的指針訪問任何數據,因為char代表byte void 指針在這里無關緊要,您可以在不涉及void *的情況下從一種類型的指針轉換為另一種類型的指針:

int main() {
    int* a = new int{ 65 };
    unsigned char *uptr = reinterpret_cast<unsigned char *>( a );
    for( size_t i = 0; i < sizeof(int); ++i )
        std::cout << static_cast<unsigned int>( uptr[i] ) << ' ';
}

活生生的例子

注意我將uptr[i]轉換為 unsigned int,即將字節打印為數字,因為 C++ stream (在這種情況下為std::cout )將字符打印為符號,在這種情況下這將毫無意義。

首先,任何 object 指針都可以轉換為void* 這是從 C 繼承的通用“可能是任何東西”解決方案,您不應該使用它。 C++ 方法是在需要任何指針的情況下使用template<typename T>T*

其次,任何 object 指針也可以作為特殊情況強制轉換為char * 轉換為char*可讓您訪問 object 的 memory 表示。 它不會將 object 轉換為 char 或任何內容,您可以訪問存儲在 object 中的值的原始位。

因此,轉換為void*然后轉換為char*起作用的原因是,將任何 object 指針轉換為char*都是有效的。 根本不需要void*的中間步驟。

這僅適用於char*unsigned char*char指針的任何其他變體,包括std::byte* 例如,您不能 static_cast 將int*轉換為float*並且使用void*和中間步驟也不會使其工作。

注意:代碼打印的值是實現定義的,因為 int 和 char 的 memory 表示由實現定義。 特別是它們的字節順序和 int 的大小以及 char 的符號。 除此之外,它完全有效的代碼。

但問題是:你為什么要這樣做?

暫無
暫無

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

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