C++ 使用指针在数组上迭代的可移植性

C++ 使用指针在数组上迭代的可移植性,c++,c,arrays,pointers,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)); } const unsigned SIZE=10; Foo数组[大小]; Foo*ptr=数组; 对于(int i=0;i

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

const unsigned SIZE = 10;
Foo array[SIZE];
Foo* ptr = array;
for (int i = 0; i < SIZE; ++i) {
    assert(&array[i] == (ptr + i));
}
const unsigned SIZE=10;
Foo数组[大小];
Foo*ptr=数组;
对于(int i=0;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);
}
for(int i=0;i

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

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)

是,它将始终为真。你自己找推荐人有困难吗?你试着去哪里寻找(有这么多答案,其中有C、C++03和C++11标准的最终草案的链接),你是如何陷入困境的。。。?对“这个问题没有显示任何研究成果”投反对票。@Jarod42:对,注释补充道。