繁体   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