一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址, 数组元素的指针就是数组元素的地址。
可以用一个指针变量指向一个数组元素,如下图所示。

在指针指向数组元素时,允许以下运算:
加一个整数(用+或+=),如p+1
减一个整数(用-或-=),如p-1
自加运算,如p++,++p
自减运算,如p--,--p
两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)
(1) 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
float a[10],*p=a;
假设a[0]的地址为2000,则
p的值为2000
p+1的值为2004(即&a[1])
(2) 如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址,或者说,它们指向a数组序号为i的元素
(3) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。

引用一个数组元素,可用下面两种方法:
(1) 下标法,如a[i]形式
(2) 指针法,如*(a+i)或*(p+i)
其中a是数组名,p是指向数组元素的指针变量,其初值p=a
例:有一个整型数组a,有10个元素,要求输出数组中的全部元素。
解题思路:引用数组中各元素的值有3种方法:(1)下标法;(2)通过数组名计算数组元素地址,找出元素的值;(3) 用指针变量指向数组元素
(1) 下标法。
#include <stdio.h>
int main()
{ int a[10]; int i;
printf(“enter 10 integer numbers:\n");
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<10;i++) printf(“%d ”,a[i]);
printf("%\n");
return 0;
}
(2) 通过数组名计算数组元素地址,找出元素的值
#include <stdio.h>
int main()
{ int a[10]; int i;
printf(“enter 10 integer numbers:\n");
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<10;i++)
printf(“%d ”,*(a+i));
printf("\n");
return 0;
}
(3) 用指针变量指向数组元素
#include <stdio.h>
int main()
{ int a[10]; int *p,i;
printf(“enter 10 integer numbers:\n");
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(p=a;p<(a+10);p++)
printf(“%d ”,*p);
printf("\n");
return 0;
}
3种方法的比较:
① 第(1)和第(2)种方法执行效率相同。C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址。因此用第(1)和第(2)种方法找数组元素费时较多。
② 第(3)种方法比第(1)、第(2)种方法快。用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。这种有规律地改变地址值(p++)能大大提高执行效率。
③ 用下标法比较直观,能直接知道是第几个元素。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。

