Для использования арифметики с указателями тип пустого указателя преобразуется несколько раз.
Вектор, содержащий данные, поступает из внешнего источника и возвращает пустой указатель для доступа к своим данным. Кроме того, шаг также задается внешним объектом, и он учитывает требования выравнивания. Для краткости примера не полностью отразить эти два факта.
// 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
внутри цикла?
Преобразование в
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
если вы не уверены, что знаете, что делаете.