1.数组指针
数组的首地址称为数组指针。若定义整型数组a[5],系统为数组分配的地址从1000到1019,则数组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不能用来进行赋值运算、”++”、”- -“等运算。
当指针变量指向数组首地址后,就可使用该指针变量对数组中任何一个元素变量进行存取操作。
用指针变量访问数组元素。
# include <iostream.h>
void main(void) {
int a[5]={0,1,2,3,4};
int 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]。
综上所述,对一维数组a[ ]而言,当p=a后,有如下等同关系成立:
① p+i=a+i=&a[i],即p+i、a+i 均表示第i个元素的地址&a[i]。
② (p+i) =(a+i)=p[i]= a[i]。即(p+i), (a+i), p[i]均表示第i个元素值a[i]。
其中p[i] 的运行效率最高。
由上所述可知:一维数组的第i个元素可用四种方式引用,即: a[i]、(p+i) 、(a+i)、p[i]。