键入指针算术的void指针的转换

时间:2015-07-26 09:47:10

标签: c++ pointers pointer-arithmetic const-pointer

对于使用指针算术,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

1 个答案:

答案 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_castvoid*与其他任何内容都兼容。除非您非常确定自己知道自己在做什么,否则请避免使用reinterpret_cast