gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:47:50 28 4
gpt4 key购买 nike

这段代码正确吗?

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com