c++ - 指向数组重叠数组末端的指针

标签 c++ c arrays language-lawyer

这段代码正确吗?

int arr[2];

int (*ptr)[2] = (int (*)[2]) &arr[1];

ptr[0][0] = 0;

显然 ptr[0][1] 会因访问 arr 的边界而无效。

注意: 毫无疑问,ptr[0][0]arr[1] 指定相同的内存位置;问题是我们是否被允许通过 ptr 访问那个内存位置。 Here还有一些例子说明表达式确实指定了相同的内存位置,但不允许以这种方式访问​​内存位置。

注意 2: 还要考虑 **ptr = 0; 。正如 Marc van Leeuwen 所指出的,ptr[0] 等价于 *(ptr + 0),但是 ptr + 0 似乎下降了犯规的指针算术部分。但是通过使用 *ptr 来避免这种情况。

最佳答案

不是一个答案,而是一个评论,如果没有文字墙,我似乎无法很好地表达:

给定的数组保证连续存储它们的内容,以便可以使用指针“迭代”它们。如果我可以获取一个指向数组开头的指针并连续递增该指针,直到我访问了数组的每个元素,那么肯定会声明该数组可以作为一系列由它组成的任何类型来访问。

当然是以下组合: 1) Array[x] 将其第一个元素存储在地址 'array' 2) 指向它的 a 指针的连续递增足以访问下一项 3) Array[x-1] 遵循同样的规则

那么至少将地址'array'看作是类型array[x-1]而不是类型array[x]应该是合法的。

此外,考虑到关于连续性以及指向数组中元素的指针必须如何表现的要点,当然,将 array[x] 的任何连续子集分组为 array[y] 肯定是合法的,其中 y < x 并且它的上bound 不超过 array[x] 的范围。

不是语言律师,这只是我在胡说八道。不过,我对这次讨论的结果非常感兴趣。

编辑:

在进一步考虑原始代码时,在我看来,数组本身在许多方面都是非常特殊的情况。它们衰减为一个指针,我相信可以按照我在本文前面所说的进行别名。

因此,如果没有任何标准来支持我的拙见,如果数组没有真正作为一个整体被统一对待,那么它就不可能真正无效或作为一个整体“未定义”。

得到统一处理的是各个元素。所以我认为只讨论访问特定元素是否有效或已定义才有意义。

关于c++ - 指向数组重叠数组末端的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29243116/

相关文章:

c++ - 更改 SDL 背景

c - 使用 -g、-ggdb、-g3 或 -ggdb3 时,GCC 不会生成调试器信息

c - 崩溃后查找%ebp(有%eip)

c++ - std::array 和 std::vector 有什么区别?你什么时候使用一个而不是另一个?

javascript - 如何将时间戳数组减少为特定时间范围内元素数量计数的数组

c++ - 在一行中定义多个变量,这是否为构建过程提供了任何优化?

c++ - 使用 C++ 的 std::move 从内部范围内的对象到外部范围安全吗?

c++ - 根据不同的标准维护一组独特的元素 C++ STL

c - 使用\r 覆盖标准输出中的上一行

python numpy 数组追加在 .py 文件中不起作用,但在终端中起作用