在不同类型之间转换常量指针
casting const pointers between different types
我有一个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
。此外,它还在不相关的指针类型之间进行转换时使用。
请记住,当可以选择时,始终最好使用限制性最强的铸造运算符,以执行您需要完成的工作。这将使编译器在您犯错时有最多的机会通知您。
请注意,您是在指针类型之间进行转换。请务必不要混淆两种类型之间的转换以及指向这些类型的两个指针之间的转换。在char
和unsigned short
之间进行转换的方式与在指针到char
和指针到unsigned short
之间转换的方式不同。
- 将常量指针引用绑定到非常量指针
- 如何使用数据对象上的常量指针初始化类
- 为什么我收到"从常量指针到指针的转换无效?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 为什么C++中没有常量引用,就像常量指针一样?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 将常量指针强制转换为非常量
- 带有常量指针的矢量构造函数示例
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- 常量指针上的混乱
- 使用 static_cast 时指向常量指针的原因
- 如何在C++中定义常量指针数组?
- 测试此指针的常量指针性质
- 当常量指针用作函数的参数时
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 在不同类型之间转换常量指针
- 解构常量指针?
- 为什么 std::vector<>::const_reference 可以转换为非常量指针?