3.5.3 指针和数组(3)
此时,ia[0]是一个使用了数组名字的表达式,对数组执行下标运算其实是对指向数组元素的指针执行下标运算:
- int i = ia[2]; // ia转换成指向数组首元素的指针
- // ia[2]得到(ia + 2) 所指的元素
- int *p = ia; // p指向ia的首元素
- i = *(p + 2); // 等价于i = ia[2]
只要指针指向的是数组中的元素(或者数组中尾元素的下一位置),都可以执行下标运算:
- int *p = &ia[2]; // p指向索引为2的元素
- int j = p[1]; // p[1]等价于 *(p + 1),就是ia[3]表示的那个元素
- int k = p[-2]; // p[-2]是ia[0]表示的那个元素
虽然标准库类型string和vector也能执行下标运算,但是数组与它们相比还是有所不同。标准库类型限定使用的下标必须是无符号类型,而内置的下标运算无此要求,上面的最后一个例子很好地说明了这一点。内置的下标运算符可以处理负值,当然,结果地址必须指向原来的指针所指同一数组中的元素(或是同一数组尾元素的下一位置)。
内置的下标运算符所用的索引值不是无符号类型,这一点与vector和string不一样。
3.5.3节练习
练习3.34:假定p1和p2指向同一个数组中的元素,则下面程序的功能是什么?什么情况下该程序是非法的?
- p1 += p2 - p1;
练习3.35:编写一段程序,利用指针将数组中的元素置为0。
练习3.36:编写一段程序,比较两个数组是否相等。再写一段程序,比较两个vector对象是否相等。