用于指针算术的 void 指针的类型转换

Type conversions of a void pointer for pointer arithmetics

为了使用指针算法,void 指针的类型被转换了多次。

包含数据的向量来自外部源,returns 用于访问其数据的空指针。此外,步幅也是由外部对象给出的,它遵循对齐要求。为了使示例简短,它没有完全反映这两个事实。

// 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) 数据,因为只转换指针的类型?

为什么 constcountPointer 上工作,尽管它会递增? const是指指针指向的数据不可更改吗?

为什么我必须使用 reinterpret_cast<const float*> 而不是 static_cast<const float*> 来在循环内转换 countPointer

The conversion to uint8_t does not affect the (float) data the pointer is pointing to since only the type of the pointer is converted?

没错。但是在投射指针时,请记住有对齐要求。另外,请注意 &list 指向 vector<Data>;您将使用 list.data() 来获取 Data* 数组。

Why const works on the countPointer though it gets incremented? Does const mean that the data the pointer points to may not be altered?

是的。写入 float * const 使指针本身成为常量或 const float * const 以获得指向常量数据的常量指针。

Why I have to use reinterpret_cast<const float*> instead of static_cast<const float*> to convert countPointer inside the loop?

兼容的类型可以用 static_cast 转换,其他类型使用 reinterpret_castvoid* 与任何其他兼容。避免使用 reinterpret_cast 除非你非常确定你知道自己在做什么。