C++ 指针算术的空指针的类型转换

C++ 指针算术的空指针的类型转换,c++,pointers,pointer-arithmetic,const-pointer,C++,Pointers,Pointer Arithmetic,Const Pointer,对于使用指针算术,空指针的类型被转换多次 包含数据的向量来自外部源,并返回一个空指针以访问其数据。此外,步幅也是由外部对象给出的,它遵循对齐要求。简而言之,这个例子并没有充分反映这两个事实 // Example data from external source. struct Data { float x; float y; Data() : x(5), y(8) {} }; // Example vector from external source. size_

对于使用指针算术,空指针的类型被转换多次

包含数据的向量来自外部源,并返回一个空指针以访问其数据。此外,步幅也是由外部对象给出的,它遵循对齐要求。简而言之,这个例子并没有充分反映这两个事实

// 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
}
//来自外部源的示例数据。
结构数据{
浮动x;
浮动y;
Data():x(5),y(8){
};
//来自外部源的示例向量。
尺寸元素=3;
std::向量表;
列表。调整(元素)大小;
//指针转换。
const void*voidPointer=list.data();//包含向量的外部对象返回一个空指针。
const uint8\u t*countPointer=静态强制转换(voidPointer);
//指针算法。
无符号步幅=sizeof(数据);//返回步幅的外部对象遵循对齐要求。
用于(大小\u t计数器=0;计数器<元素;++计数器,计数器指针+=步幅){
常量浮点*pointsToFloatX=重新解释强制转换(countPointer);
printf(“%f,”,*pointsToFloatX);//应该是5.0000、5.0000、5.0000之类的值
}
转换为
uint8\t
不会影响指针指向的(
float
)数据,因为只转换指针的类型

为什么
const
可以在
countPointer
上工作,尽管它是递增的?
const
是否意味着指针指向的数据不能更改

为什么我必须使用
reinterpret\u cast
而不是
static\u cast
来转换循环中的
countPointer

转换为
uint8\t
不会影响指针指向的(
float
)数据,因为只转换指针的类型

对。但在投射指针时,请记住有对齐要求。另外,请注意,
&list
指向
向量
;您可以使用
list.data()
获取
data*
数组

为什么
const
可以在
countPointer
上工作,尽管它是递增的?
const
是否意味着指针指向的数据不能更改

对。写入
float*const
以使指针本身保持不变,或写入
const float*const
以获取指向常量数据的常量指针

为什么我必须使用
reinterpret\u cast
而不是
static\u cast
来转换循环中的
countPointer


兼容类型可以使用
静态\u cast
强制转换,其他类型可以使用
重新解释\u cast
<代码>无效*与任何其他代码兼容。除非您非常确定自己知道自己在做什么,否则请避免使用
重新解释\u cast

此类指针操作是未定义的行为。@AlexD如果使用
&list[0]
而不是
&list
@MattMcNabb,则可能是合法的,但向量是
数据类型的。将
Data*
转换到
uint8\u t*
(通过
void*
)看起来不太好。@AlexD当向量元素的类型不同时,你会如何做指针算术,你所拥有的唯一信息是步幅大小?@MattMcNabb我已经更正了这个问题。这是一个有点杂乱无章的问题的好答案+1
uint8\u t
float
是不兼容的类型b/c
uint8\u t
在内存中的长度较短,因此存储的信息少于
float
?@RoiDanton,它们不兼容,因为
uint8_t
不是
float
的基类,并且没有特殊规则说明它们应该兼容(例如,对于
void*
和枚举/整数指针转换,就有这样的规则)@rholmes我更新了这个问题,告诉大家为什么在示例中使用空指针,以及步幅的来源。