对于使用指针算术,void指针的类型被多次转换。
包含数据的向量来自外部源并返回void指针以访问其数据。此外,步幅也由外部物体给出,并且它满足对准要求。为了使示例简短, 不能完全反映这两个事实。
// Example data from external source.
struct Data {
float x;
float y;
Data() : x(5), y(8) {}
};
// Example vector from external source.
size_t elements = 3;
std::vector<Data> list;
list.resize(elements);
// Pointer conversions.
const void * voidPointer = list.data(); // The external object containing the vector returns a void pointer.
const uint8_t * countPointer = static_cast<const uint8_t*>(voidPointer);
// Pointer arithmetics.
unsigned stride = sizeof(Data); // The external object returning the stride heeds alignment requirements.
for (size_t counter = 0; counter < elements; ++counter, countPointer += stride) {
const float * pointsToFloatX = reinterpret_cast<const float*>(countPointer);
printf("%f, ", *pointsToFloatX); // Expecting something like 5.0000, 5.0000, 5.0000
}
转换为uint8_t
不会影响指针指向的(float
)数据,因为只转换了指针的类型?
为什么const
会在countPointer
上运行,但它会增加? const
是否意味着指针指向的数据可能不会被更改?
为什么我必须使用reinterpret_cast<const float*>
代替static_cast<const float*>
在循环中转换countPointer
?
答案 0 :(得分:2)
转换为
uint8_t
不会影响指针指向的(float
)数据,因为只转换了指针的类型?
那是对的。但是在构建指针时,请记住有对齐要求。另请注意,&list
指向vector<Data>
;您可以使用list.data()
获取Data*
数组。
为什么
const
会在countPointer
上运行,但它会增加?const
是否意味着指针指向的数据可能不会被更改?
是。写float * const
使指针本身保持不变或写const float * const
以获得指向常数数据的常量指针。
为什么我必须使用
reinterpret_cast<const float*>
代替static_cast<const float*>
在循环中转换countPointer
?
可以使用static_cast
投射兼容类型,其他人使用reinterpret_cast
。 void*
与其他任何内容都兼容。除非您非常确定自己知道自己在做什么,否则请避免使用reinterpret_cast
。