c++ - 这种计算数组长度的方法是如何工作的?

标签 c++ arrays pointers

我是 C++ 新手,偶然发现了这种用我不完全理解的指针计算数组长度的方法。我到处看了看,但似乎无处解释它是如何工作的,我只是听说它应该是计算数组长度的一种不好的方法,但为什么会这样以及它是如何工作的?

代码如下所示:

int array[4] = [0, 1, 2, 3]
//...
int length = *(&array + 1) - array

据我尝试,它似乎确实有效,但我不完全明白为什么。我知道一点指针逻辑,但这个语句对我来说似乎很奇怪,因为你实际上是在获取数组的地址(我想是第一个元素)并向其中添加一个(我可以想象这会给你地址在最后一个元素之后,但我不明白你为什么要取消引用它)。最让我困惑的是,这一切都被数组本身减去了吗?!没有索引或任何东西。

如果有人能够向我解释这一点,以及为什么它应该是坏的,那真的很有帮助。

谢谢。

最佳答案

&array

这是一个指向对象array的指针。它是一个数组类型的奇异对象。

&array + 1

向指针添加数字会生成指向对象数组中对象的连续兄弟的指针。加 1 产生下一个兄弟。出于此指针算法的目的,单个对象被视为单个对象的数组。因此,加 1 是允许的,它会在图形数组的末尾产生一个指针。

*(&array + 1)

严格来说,这通过一个指针间接传递到末尾,并且可能会认为程序的行为是未定义的。

但让我们假设这不是问题。间接操作在数组后面的地址处为(不存在的)对象生成一个左值。

*(&array + 1) - array

这里,减法的操作数是数组的左值。一个是实际数组,另一个是假设的数组数组中的假设兄弟元素。在这种情况下,这些数组隐式转换为指向相应数组第一个元素的指针。

从技术上讲,转换后的指针之间的减法是未定义的,因为它们是指向不同数组元素的指针,因此可以说程序的行为未定义还有另一个原因。

但让我们假设这不是问题。将指向同一数组的两个元素的指针相减的结果产生了元素的距离。相邻数组的第一个元素之间的距离正好是第一个数组的元素个数。

why it's supposed to be bad exactly.

请注意前面部分中提到程序行为未定义的部分。这很糟糕。

另外,您在理解它的作用时遇到了问题。这很糟糕。

获取数组大小的推荐方法是使用 std::size(array)

关于c++ - 这种计算数组长度的方法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72198985/

相关文章:

c - C中最简单的int数组排序函数

c - GCC - 我应该如何正确格式化这个字符串?段错误

c - 如何删除用户在 c 中选择的二维数组的 N 行和列数

c++ - std::hash 用于 std::chrono::duration

Java 函数从 C++ 代码 Eclipse jni 获取结果

javascript - 如何减少和映射对象数组?

C++ 设置动态创建数组的值失败

c - gets() 和 scanf 之间的区别 ("%s")

c++ - 如何在不使用循环的情况下简洁地找到字符串中的所有数字?

c++ - OpenCV 如何确定具有不同参数的函数的 python 绑定(bind)?