c++ - static_cast void* char* 与 static_cast void** char**

标签 c++ casting static-cast

如果我执行以下操作,一切正常:

char* cp = "abc";
void* vp = NULL;
vp = static_cast<void*>(cp);//ok
cp = static_cast<char*>(vp);//ok

但下面不是:

char** cpp = &cp;
void** vpp = NULL;
vpp = static_cast<void**>(cpp);//error C2440: 'static_cast':
                               //cannot convert from 'char **' to 'void **'
cpp = static_cast<char**>(vpp);//error C2440: 'static_cast':
                               //cannot convert from 'void **' to 'char **'

有人可以向我解释为什么不允许使用第二个示例。请不要引用 C++ 标准作为你的整个答案,因为我已经看到引用它的答案,但我不明白它们的意思。我想了解为什么第二个示例不起作用(即,如果您能举一个危险的示例,那将是一个很大的帮助)。因为我不明白。对我来说,这两个例子都是指针。为什么额外的间接级别会有所不同?

最佳答案

A void *指针可以指向“任何东西”,将所有指针转换为 void * 是有效的, 并且从 void * 转换所有指针是有效的到其他类型。

然而,一个void **是一个指向 void * 的指针值(value)。还有一个 char **是指向 char * 的指针值(value)。这些类型不指向可相互转换的类型。如果您需要这样做,您可以使用 void **vpp = reinterpret_cast<void **>(cpp); ,但它“不安全”(你基本上是在告诉编译器“看,我知道我在做什么,所以就去做吧”,这可能不会像你实际期望的那样......)

关于c++ - static_cast void* char* 与 static_cast void** char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16280814/

相关文章:

c++ - 如何将 static_cast 与双重类型转换一起使用

c++ - C++中如何定义从整数到 float 的精度损失?

c++ - 从基类指针 C++ 访问子类成员

c++ - 使用静态强制转换时,强制转换为类类型还是对象引用更有意义?

c++ - vs2010 c++尾调用优化

c++ - 在两个不同的程序之间发送/接收数据

Java 矩形和转换

c++ - 将二进制文件读入 Armadillo 矩阵的直接方法?

c++ - 无法在地址错误处访问内存

c++ - 在 C++ 中定义变量和指针(错误 : Segmentation fault (core dumped))