如何正确取消引用 typedef 数组指针?
How to dereference typedef array pointer properly?
我正在使用第 3 方代码,其类型定义为:
typedef float MarkerData[3];
稍后在代码中,我将此标记位置数据的数组引用为:
MarkerData* Markers;
我正在使用这段代码迭代这个数组:
for (int32 s = 0; s < totalMarkers; s++)
{
MarkerData* mData = (Markers + s);
markerPosition.X = *(mData)[0];
markerPosition.Y = *(mData)[1];
markerPosition.Z = *(mData)[2];
}
代码没有崩溃,但浮点值混合在一起。从调试中我可以看到,我在每次迭代中都正确地获得了 markerPosition.X 值,但是 Z 和 Y 是从其他数组中获取的。我想我在这里使用了错误的指针算法,但无论如何,都无法弄清楚。这个 typedef 对我来说真的很新,我不知道 - 可能有什么问题?
这是对Operator Precedence的误解造成的bug。运算符具有应用它们的顺序。这类似于数学中的运算符优先级,例如,乘法比加法具有更高的优先级。 operator*
(取消引用运算符)的优先级低于 operator[]
(下标运算符)。这意味着表达式 *(mData)[2]
被解析为 "dereference the third element at pointer mData
"。第三个元素大概是一个包含 3 个浮点数的数组(如果你没有超出 mData
指向的数组的边界)。然后取消引用结果数组。取消引用数组会为您提供该数组中的第一个元素。本质上,您是在一遍又一遍地获取不同标记的第一个元素。您可以使用括号更改优先级。请尝试 (*mData)[0]
。这将首先强制取消引用您的指针,为您提供 float
s 数组,然后使用下标运算符通过索引访问该数组。
for (int32 s = 0; s < totalMarkers; s++)
{
MarkerData* mData = (Markers + s);
markerPosition.X = (*mData)[0];
markerPosition.Y = (*mData)[1];
markerPosition.Z = (*mData)[2];
}
大多数问题都可以通过使用适当的 c++ 容器来避免,例如 std::array
and std::vector
。
我正在使用第 3 方代码,其类型定义为:
typedef float MarkerData[3];
稍后在代码中,我将此标记位置数据的数组引用为:
MarkerData* Markers;
我正在使用这段代码迭代这个数组:
for (int32 s = 0; s < totalMarkers; s++)
{
MarkerData* mData = (Markers + s);
markerPosition.X = *(mData)[0];
markerPosition.Y = *(mData)[1];
markerPosition.Z = *(mData)[2];
}
代码没有崩溃,但浮点值混合在一起。从调试中我可以看到,我在每次迭代中都正确地获得了 markerPosition.X 值,但是 Z 和 Y 是从其他数组中获取的。我想我在这里使用了错误的指针算法,但无论如何,都无法弄清楚。这个 typedef 对我来说真的很新,我不知道 - 可能有什么问题?
这是对Operator Precedence的误解造成的bug。运算符具有应用它们的顺序。这类似于数学中的运算符优先级,例如,乘法比加法具有更高的优先级。 operator*
(取消引用运算符)的优先级低于 operator[]
(下标运算符)。这意味着表达式 *(mData)[2]
被解析为 "dereference the third element at pointer mData
"。第三个元素大概是一个包含 3 个浮点数的数组(如果你没有超出 mData
指向的数组的边界)。然后取消引用结果数组。取消引用数组会为您提供该数组中的第一个元素。本质上,您是在一遍又一遍地获取不同标记的第一个元素。您可以使用括号更改优先级。请尝试 (*mData)[0]
。这将首先强制取消引用您的指针,为您提供 float
s 数组,然后使用下标运算符通过索引访问该数组。
for (int32 s = 0; s < totalMarkers; s++)
{
MarkerData* mData = (Markers + s);
markerPosition.X = (*mData)[0];
markerPosition.Y = (*mData)[1];
markerPosition.Z = (*mData)[2];
}
大多数问题都可以通过使用适当的 c++ 容器来避免,例如 std::array
and std::vector
。