使用指针迭代数组的可移植性

时间:2014-11-27 03:24:27

标签: c++ c arrays pointers

无论平台如何,以下断言是否总是正确,您是否有此保证的参考?

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);
}

我的理解是,并不是所有的架构在寻址内存时都使用相同的顺序,所以我很好奇指针方法的可移植性。如果您要搜索此网站以使用“带指针的迭代数组”或在搜索中错误地包含endian,则不会出现任何相关内容。

1 个答案:

答案 0 :(得分:3)

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)