gpt4 book ai didi

c++ - 数组内存地址总是按照从小到大的顺序排列吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:33:01 27 4
gpt4 key购买 nike

当我使用指针运算和 != 制作过程时, 比如

template <typename T> void reverse_array ( T * arr, size_t n )
{
T * end = arr + n;
while (arr != end && arr != --end)
{
swap(arr,end);
++arr;
}
}

我总是非常小心,因为如果我写错了程序,那么在极端情况下,第一个指针可能会“跳过”第二个指针。但是,如果数组是这样的

&arr[0] < &arr[1] < ... < &arr[n]

对于任何数组 arr长度n-1 , 那么我不能做类似的事情吗

template <typename T> void reverse_array ( T * arr, size_t n )
{
T * end = arr + n;
if (arr == end) break;
--end;
while (arr < end)
{
swap(arr,end);
++arr; --end;
}
}

因为它更具可读性?还是有危险迫在眉睫?内存地址不只是整数类型,因此可以与 < 相媲美吗? ?

最佳答案

关系运算符被定义为在比较同一数组内的地址(实际上,也是类类型的对象,其中也有一些关于内存布局的保证)时正确工作,包括尾后一个指针。

但是,如果您“跳过”数组末尾指针,您将不再比较同一数组中的两个地址,并且行为未定义。 (一个原因是,当您在对象外部进行指针运算时,您实际上可能会遇到回绕,但 UB 不受限制)。

关于跳跃,你的情况非常好,因为你的 end 指针不是数组的最后一个,因为你总是至少做一个 - -结束。一个空数组,其中 --end 移动到数组之外,将是一个问题,但您单独测试它。

结论:您的第二个代码完全有效。

关于c++ - 数组内存地址总是按照从小到大的顺序排列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29867766/

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