Aer*_*rix 3 c++ arrays pointers
我是 C++ 新手,偶然发现了这种用我不太理解的指针计算数组长度的方法。我到处找,但似乎没有一个地方解释它是如何工作的,我只是听说这应该是计算数组长度的糟糕方法,但为什么会这样以及它是如何工作的?
代码看起来像这样:
int array[4] = [0, 1, 2, 3]
//...
int length = *(&array + 1) - array
Run Code Online (Sandbox Code Playgroud)
据我尝试过,它似乎确实有效,但我不太明白为什么。我知道一点指针逻辑,但这个语句对我来说似乎很奇怪,因为你本质上是获取数组的地址(我认为的第一个元素)并向其添加一个(我可以想象这会给你地址在最后一个元素之后,但我不明白为什么你会取消引用它)。最让我困惑的是,这一切都被数组本身减去了?!没有索引或任何东西。
当有人能够向我解释这一点以及为什么它应该是糟糕的时,这确实会有帮助。
谢谢。
Run Code Online (Sandbox Code Playgroud)&array
这是一个指向该对象的指针array。它是数组类型的单个对象。
Run Code Online (Sandbox Code Playgroud)&array + 1
将数字添加到指针会生成一个指向对象数组中该对象的连续同级对象的指针。加 1 产生下一个同级。出于此指针算术的目的,单个对象被视为单个对象的数组。因此,加 1 是允许的,并且它会生成一个超出图形数组末尾的指针。
Run Code Online (Sandbox Code Playgroud)*(&array + 1)
严格来说,这是通过超出末尾的指针间接进行的,并且可能会争论程序的行为是未定义的。
但我们假设这不是问题。间接操作会为数组后面地址处的(不存在的)对象生成一个左值。
Run Code Online (Sandbox Code Playgroud)*(&array + 1) - array
这里,减法的操作数是数组的左值。一个是实际数组,另一个是假设的数组数组中的假设同级元素。在这种情况下,这些数组隐式转换为指向各自数组的第一个元素的指针。
从技术上讲,转换后的指针之间的减法是未定义的,因为它们是指向单独数组的元素的指针,因此可以说程序的行为由于另一个原因而未定义。
但我们假设这不是问题。指向同一数组的两个元素的指针相减的结果得出元素的距离。相邻数组的第一个元素之间的距离恰好是第一个数组中元素的数量。
为什么它应该是坏的。
请注意前面几节中提到程序行为未定义的部分。那很糟。
另外,您在理解它的作用时也遇到了问题。那很糟。
获取数组大小的推荐方法是使用std::size(array).