无论平台如何,以下断言是否总是正确,您是否有此保证的参考?
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,则不会出现任何相关内容。
答案 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)
。