我们知道,当我们使用数组名的时候实际上使用的是指向数组首元素的指针,实际上,使用数组名参加下标运算时本质上参加运算的仍然是指向数组首元素的指针:

1
2
int arr[] = {3, 5, 2, 1, 4, 5, 6, 2};
int i = arr[2]; // i 的值是 2

arr[2] 实际的运算过程是这样的:*(arr + 2)

其实,只要指针指向的是数组中的某一个元素(或者数组中尾元素的下一位置),都能对它进行下标运算:

1
2
3
int *p = &arr[2];  // 指针 p 指向索引为 2 的元素
int j = p[3]; // p[3] 等价于 *(p + 3),就是元素 arr[5]
int k = p[-2]; // p[-2] 等价于 *(p - 2),就是元素 arr[0]

需要注意的是,虽然数组和标准库类型 vectorstring 都能进行下标运算,但是, 标准库类型使用的下标必须是无符号类型,而内置的下标运算没有这个要求