7.2 指针与数组
由上节的例 7.4可知,可用指针变量来访问数组中任一元素,通常将数组的首地址称为数组的指针,而将指向数组元素的指针变量称为指向数组的指针变量。使用指向数组的指针变量来处理数组中的元素,不仅可使程序紧凑,而且还可提高程序的运算速率。
7.2.1 一维数组与指针
1.数组指针
数组的首地址称为数组指针。若定义整型数组a[5],系统为数组分配的地址从1000到1019,如图7.5所示,则数组a的首地址1000为数组a的数组指针。C++规定,数组的首地址可用数组名a表示,因此,数组a的数组指针=a=&a[0]。
2.数组指针变量
存放数组元素地址的变量称为数组指针变量。如:
int a[5];
int *p=&a[0];
则p为数组指针变量。在C++中数组名a可用于表示数组的首地址,所以数组名a可作为数组指针使用。因此:p=a与p=&a[0] 的作用是相同的。但数组名a不能用来进行赋值运算、"++"、"- -"等运算。
当指针变量指向数组首地址后,就可使用该指针变量对数组中任何一个元素变量进行存取操作。现举例说明如下:
【例7.6】用指针变量访问数组元素。
# include <iostream.h>
void main( void)
{ int a[5]={0,1,2,3,4},i,j,*p,n=5;
p=a;
for (i=0;i<n;i++)
{ cout <<*p<<'\t';
p++;
}
cout<<endl;
p=a;
for (i=0;i<n;i++) cout <<*(p+i)<< '\t';
cout<<endl;
for (i=0;i<n;i++) cout <<*(a+i)<< '\t';
cout<<endl;
for (i=0;i<n;i++) cout <<p[i]<< '\t';
cout<<endl;
}
执行程序后,输出:
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
由上例可以看出,访问数组元素值有三种方法:
(1)通过移动指针变量,依次访问数组元素。如:
p=a;
for (i=0;i<n;i++)
{ cout <<*p<<'\t'; p++;}
首先将指针变量p指向数组a的首地址。然后用*p输出数组第i个元素的值,每次输出后用p++移动指针到下一个元素,依次循环直到结束。注意:cout <<*p<<'\t'; p++;可合并为一条语句:cout<<*p++<<'\t';
(2)指针变量不变,用p+i或 a+i 访问数组第i个元素。如:
for (i=0;i<n;i++) cout <<*(p+i)<< '\t';
for (i=0;i<n;i++) cout <<*(a+i)<< '\t';
在C++中允许用p+i 或a+i 表示第i 个元素的地址。因此,*(p+i)与*(a+i)均表示第i个元素的内容。
(3)以指针变量名作为数组名访问数组元素。如:
for (i=0;i<n;i++) cout <<p[i]<< '\t';
若用指针变量名p作为数组名,则p[i]表示数组的第i个元素a[i]。
3.数组元素的引用