使用指针遍历数组的可移植性
Portability of iterating over an array using a pointer
无论平台如何,以下断言是否始终为真,您对此保证有参考吗?
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)
。
相关文章:
- C++Union/Struct位域的实现和可移植性
- 静态库可移植性
- C++:Unicode 字符串文字的可移植性
- 如何使Visual Studio 2017 C++项目在计算机之间更具可移植性
- 在为视频游戏实施基本的二进制序列化时,请担心可移植性
- 重写类以使其更通用,以实现可移植性
- 可用于键入数组别名
- Visual Studio 2015 <=> QtCreator 5 (c++) 代码可移植性
- 通过虚拟接口类导出C 类的可移植性
- 位移位可移植性
- 如何在Visual Studio中进行串行端口编程C++Windows和Linux之间的可移植性?
- 提高 Python 可移植性问题
- 库如何在不同的操作系统之间实现可移植性
- 使用C 11 /最近的G 版本(4.7 / 4.6)的可移植性
- 模板函数实例化的可移植性问题
- XCode、命名空间、C++和代码可移植性
- 嵌入式C++项目 - 需要支持智能指针.可能的可移植性问题
- 使用指针遍历数组的可移植性
- 可视化数组指针的矢量 C++
- C++中可变长度堆栈上的可视化数组分配