Преобразования типов пустого указателя для арифметики указателей

Для использования арифметики с указателями тип пустого указателя преобразуется несколько раз.

Вектор, содержащий данные, поступает из внешнего источника и возвращает пустой указатель для доступа к своим данным. Кроме того, шаг также задается внешним объектом, и он учитывает требования выравнивания. Для краткости примера не полностью отразить эти два факта.

// 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

Решение

Преобразование в 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 если вы не уверены, что знаете, что делаете.

2

Другие решения