6.3.1 指向数组元素的指针
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。
int a[10]; //定义一个整型数组a,它有10个元素
int *p; //定义一个基类型为整型的指针变量p
p=&a[0]; //将元素a[0]的地址赋给指针变量p,使p指向a[0]
在C++中,数组名代表数组中第一个元素(即序号为0的元素)的地址。因此,下面两个语句等价:

p=&a[0];
p=a;
在定义指针变量时可以给它赋初值:
int *p=&a[0]; //p的初值为a[0]的地址
也可以写成
int *p=a; //作用与前一行相同
可以通过指针引用数组元素。假设p已定义为一个基类型为整型的指针变量,并已将一个整型数组元素的地址赋给了它,使它指向某一个数组元素。如果有以下赋值语句:
*p=1; //对p当前所指向的数组元素赋予数值1
如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。
如果p的初值为&a[0],则:
(1) p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素,见图6.12。

(2) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。
可以看出,[]实际上是变址运算符。对a[i]的求解过程是: 先按a+i×d计算数组元素的地址,然后找出此地址所指向的单元中的值。
(3) 指向数组元素的指针变量也可以带下标,如p[i]与*(p+i)等价。
根据以上叙述,引用一个数组元素,可用以下方法:
(1) 下标法,如a[i]形式;
(2) 指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量。如果已使p的值为a,则*(p+i)就是a[i]。可以通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高。
例6.5 输出数组中的全部元素。
假设有一个整型数组a,有10个元素。要输出各元素的值有3种方法:
(1) 下标法
#include <iostream>
using namespace std;
int main( )
{ int a[10];
int i;
for(i=0;i<10;i++)
cin>>a[i]; //引用数组元素a[i]
cout<<endl;
for(i=0;i<10;i++)
cout<<a[i]<<″ ″; //引用数组元素a[i]
cout<<endl;
return 0;
}
运行情况如下:
9 8 7 6 5 4 3 2 1 0↙ (输入10个元素的值)
9 8 7 6 5 4 3 2 1 0 (输出10个元素的值)
(2) 指针法
将上面程序第7行和第10行的“a[i]”改为“*(a+i)”,运行情况与(1)相同。
(3) 用指针变量指向数组元素
#include <iostream>
using namespace std;
int main( )
{ int a[10];
int i,*p=a; //指针变量p指向数组a的首元素a[0]
for(i=0;i<10;i++)
cin>>*(p+i); //输入a[0]~a[9]共10个元素
cout<<endl;
评论