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:对,注释补充道。