使用指针遍历数组的可移植性

Portability of iterating over an array using a pointer

本文关键字:可移植性 数组 遍历 指针      更新时间:2023-10-16

无论平台如何,以下断言是否始终为真,您对此保证有参考吗?

const unsigned SIZE = 10;
Foo array[SIZE];
Foo* ptr = array;
for (int i = 0; i < SIZE; ++i) {
    assert(&array[i] == (ptr + i));
}

编辑:为了澄清这个问题,可以使用 for 循环通过以下方式迭代数组的元素:

for (int i = 0; i < array_size; ++i) {
   DoSomethingWith(array[i]);
}

Foo* end = array + array_size;
for (Foo* ptr = array; ptr < end; ++ptr) {
   DoSomethingWith(*ptr);
}

我的理解是,并非所有架构在寻址内存时都使用相同的顺序,所以我对指针方法的可移植性感到好奇。如果您要在此网站上搜索"使用指针迭代数组"或错误地在搜索中包含字节序,则不会显示任何相关内容。

C++标准,§ 5.2.2 节 [expr.sub] :

表达式 E1[E2] 与 *((E1)+(E2))相同(根据定义)

所以array[i]*(array + i)一样

ptr == array以来,它也*(ptr + i)

所以,&array[i]&(*(ptr + i)),这是(ptr + i)


注意:

这是假设您没有覆盖Foo::operator &:如果是这样,则&(*(ptr + i))的结果可能不会(ptr + i)