首先,表达式中使用的数组指示符(极少例外)被转换为指向其第一个元素的指针。
所以在这个声明中
int * ptr = arr
正在创建局部变量ptr,它将指向数组arr的第一个元素。
这个表达式
arr + arrSize
指向数组arr的最后一个元素之后的一个元素。
因此在循环内,由于指针ptr 的递增,数组的所有元素都被顺序访问,直到指针ptr 指向数组最后一个元素之后的一个元素。
这是一个演示程序。
#include <iostream>
int main()
{
const size_t arrSize = 5;
int arr[arrSize] = { 1, 2, 3, 4, 5 };
size_t i = 0;
for ( int *ptr = arr; ptr != arr + arrSize; ptr++ )
{
std::cout << "ptr = " << ptr << ", &arr[" << i << "] = " << &arr[i] << '\n';
std::cout << "*ptr = " << *ptr << ", arr[" << i << "] = " << arr[i] << '\n';
std::cout << '\n';
i++;
}
return 0;
}
它的输出可能看起来像
ptr = 0x7ffeb74dbd00, &arr[0] = 0x7ffeb74dbd00
*ptr = 1, arr[0] = 1
ptr = 0x7ffeb74dbd04, &arr[1] = 0x7ffeb74dbd04
*ptr = 2, arr[1] = 2
ptr = 0x7ffeb74dbd08, &arr[2] = 0x7ffeb74dbd08
*ptr = 3, arr[2] = 3
ptr = 0x7ffeb74dbd0c, &arr[3] = 0x7ffeb74dbd0c
*ptr = 4, arr[3] = 4
ptr = 0x7ffeb74dbd10, &arr[4] = 0x7ffeb74dbd10
*ptr = 5, arr[4] = 5
注意这个表达式中的那个
arr + arrSize
这里用到了所谓的指针算法。例如
( arr + arrSize ) - arr
给出两个指针表达式arr + arrSize 和arr 之间的元素arrSize 的数量。