4.2.4 使用指针访问数组元素
C++语言中,指针和数组密切相关。特别是在表达式中使用数组名时,该名字会自动转换为指向数组第一个元素的指针。
如果希望使指针指向数组中的另一个元素,则可使用下标操作符给某个元素定位,然后用取地址操作符&获取该元素的存储地址。
int arr[] = {1,2,3};
int *p1 = arr;
int *p2 = &arr[2];
cout << *p1 << endl; //1
cout << *p2 << endl; //3
1. 指针的算术操作
指针的算术操作和迭代器的算术操作以相同的方式实现(也具有相同的约束)。使用指针的算术操作在指向数组某个元素的指针上加上(或减去)一个整型数值,就可以计算出指向数组另一元素的指针值。
指针的算术操作只有在原指针和计算出来的新指针指向同一个数组的元素,或指向该数组存储空间的下一个单元时才是合法的。如果指针指向一对象,我们还可以在指针上加1从而获取指向相邻的下一个对象的指针。
int arr[] = {1,2,3};
int *p1 = arr;
cout << *p1 << endl; //1
cout << *(p1+1) << endl; //2
C++还支持对这两个指针做减法操作:
int arr[] = {1,2,3};
int *p1 = &arr[2];
cout << *p1 << endl; //3
cout << *(p1-1) << endl; //2
两个指针减法操作的结果是标准库类型(library type)ptrdiff_t的数据。与size_t类型一样,ptrdiff_t也是一种与机器相关的类型,在cstddef头文件中定义。size_t是unsigned类型,而ptrdiff_t则是signed整型。
如果一指针具有0值(空指针),则在该指针上加0仍然是合法的,结果得到另一个值为0的指针。也可以对两个空指针做减法操作,得到的结果仍是0.