在不同类型之间转换常量指针

casting const pointers between different types

本文关键字:常量 指针 转换 之间 同类型      更新时间:2023-10-16

我有一个C++函数,其中一个输入参数的类型是char const* buffer。我的理解是,这个数组的基础值可以更改,但指针本身不能移动到指向其他东西。

现在我想做的是将此数组重新解释为unsigned short并进行一些操作。所以,我做了这样的事情:

char const * current = &buffer[currentLine]; // Points to some location
unsigned short * const values = static_cast<unsigned short * const>(current);
// Change some of these values

这会导致invalid cast from top char * const to type short unsigned int * const.

这个铸造应该如何进行?

我的理解是这个数组的底层值 可以更改,但指针本身无法移动到指向 别的。

不。这意味着您也不能更改此指针指向的实体,但您可以更改指针本身。要禁止更改指针,您必须使指针本身const

const char* const buffer;
^^^^^

这个铸造应该如何进行?

铸造应reinterpret_cast进行。

只有以下转换可以用reinterpret_cast完成,除非这种转换会抛弃恒定性或波动性。

5( 任何指向 T1 类型的对象的指针都可以转换为指向另一种类型 cv T2 对象的指针。

所以你必须写:

unsigned short * const values = reinterpret_cast<unsigned short * const>(current);

甚至:

decltype(auto) values = reinterpret_cast<unsigned short * const>(current);

最后,static_cast在这里不适用,因为您尝试在不同的不相关的指针类型之间执行强制转换。

为了帮助您确保类型安全,每个强制转换都有一组有限的转换。这使您可以帮助传达您打算对强制转换执行的操作,从而使编译器在意外执行非预期转换时警告您。

static_cast是一个相对安全的铸造操作员。它允许最常见和最安全的转换,包括那些已经隐式允许的转换。这不包括在不相关的指针类型之间进行转换,这通常是危险的。要使用的正确转换运算符是reinterpret_cast。当您想要将某些内存解释为给定类型时,无论该内存实际表示的对象类型如何,都会使用该reinterpret_cast。此外,它还在不相关的指针类型之间进行转换时使用。

请记住,当可以选择时,始终最好使用限制性最强的铸造运算符,以执行您需要完成的工作。这将使编译器在您犯错时有最多的机会通知您。

请注意,您是在指针类型之间进行转换。请务必不要混淆两种类型之间的转换以及指向这些类型的两个指针之间的转换。在charunsigned short之间进行转换的方式与在指针char指针unsigned short之间转换的方式不同。