用于指针算术的 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
) 数据,因为只转换指针的类型?
为什么 const
在 countPointer
上工作,尽管它会递增? 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_cast
。 void*
与任何其他兼容。避免使用 reinterpret_cast
除非你非常确定你知道自己在做什么。
为了使用指针算法,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
) 数据,因为只转换指针的类型?
为什么 const
在 countPointer
上工作,尽管它会递增? 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 thecountPointer
though it gets incremented? Doesconst
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 ofstatic_cast<const float*>
to convertcountPointer
inside the loop?
兼容的类型可以用 static_cast
转换,其他类型使用 reinterpret_cast
。 void*
与任何其他兼容。避免使用 reinterpret_cast
除非你非常确定你知道自己在做什么。