c++ - 为什么我需要 reinterpret_cast 将 Fred ** const 转换为 void ** const?

标签 c++ void-pointers reinterpret-cast static-cast

我有一个指向 Fred 的指针的 const 指针,但我不明白为什么 static_cast 是不够的。

typedef struct {
    int n;
} Fred;

Fred *pFred;
Fred **const ppFred = &pFred;
void **const ppVoid = static_cast<void ** const>(ppFred);

请有人解释为什么需要 reinterpret_cast 将指向 Fred* 的指针转换为指向 void* 的指针static_cast 可以将指向 Fred 的指针转换为指向 void 的指针。

最佳答案

Fred*void* 不要求大小相同 和代表性。 (我在他们没有的机器上工作过, 虽然那是在我的 C++ 时代之前。)当您将 Fred* 转换为 void*,你会得到一个新的指针,它的大小可能不同 表示,但没有关于大小和 void* 指向的对象的表示。你知道这是 未知,并且使用此 void* 的唯一方法是将其转换回 Fred*(模数,例如 cv-qualifiers)。当你转换 Fred**void**,您正在从指针转换为具体类型(a 指向 Fred* 的指针)指向另一个具体类型的指针(指针 到 void*)。而且由于不能保证这两个具体 类型具有相同的大小和表示,转换需要 reinterpret_castvoid 是一种特殊的非具体类型,因此您可以 static_cast 指向和指向 void 的指针的任何类型的指针。 void* 只是另一种具体的指针类型,因此可以转换为 指向它的指针遵循通常的规则(并且需要 reinterpret_cast)。

在很多方面,情况很像intdouble,其中 void* 扮演 int(比方说)的角色,Fred* 扮演 double 的角色。 intdouble 之间的 static_cast 没有问题,但是 int*double* 之间的转换需要 reinterpret_cast

关于c++ - 为什么我需要 reinterpret_cast 将 Fred ** const 转换为 void ** const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11410783/

相关文章:

C: 函数通过 void * 返回

c - C 中的通用指针和内存分配

c++ - void 如何使用类型别名?

c++ - 为什么允许将整型、枚举和成员指针类型reinterpret_cast 为自身?

c++ - directxtutorial.com 教程不会在 g++ 中编译

c++ - OpenCV中 "object detection"基于HOG特征的SVM分类器

c++ - 为什么 std::numeric_limits<T>::max() 是一个函数?

c++ - Boost 单元测试框架 dll 导出的 std::basic_ostringstream 导致 "already defined symbol"-error

c - 在 C 中打印一个 void* 变量

c++ - 重新解释强制转换为不同类型的C++