一、数组元素的指针
1、数组元素的指针
所谓数组元素的指针就是数组的地址。
用一个指针变量指向一个数组元素:
int a[5]=(1,3,5,7,9);int *p;
p=&a[0];
以上指针变量p指向a数组的第0号元素。
在c语言中,数组名代表数组中首元素的地址,它是一个指针型常量,它的值在程序运算期间是固定不变的。因此,下面两个语句等价:
p=&a[0];
p=a;
2、在引用数组元素时指针的运算
在指针已指向一个数组元素使,可以对指针进行以下运算:
加一个整数(用+或+=),如p+1;
减一个整数(用-或-=),如p-1;
自加运算,如p++,++p;
自减运算,如p--,--p;
两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)
两个地址不能相加,如p1+p2是无实际意义的。
注:
(1)如果数组变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
(2)[ ]实际是变址运算符,即将a[i]按a+i计算地址,然后找出此地址单元中的值。
(3)如果指针变量p1和p2都是指向同一数组中的元素,如执行p2-p1,结果是p2-p1的值(两个地址之差)除以数组元素的元素的长度。
这个结果是有意义的,表示p2所指的元素与p1所指的元素之间差两个元素。即用p2-p1可知道它们所指元素的相对距离。
(4)指针变量可以带下标,对p[i]处理成*(p+i),如果p指向一个整形数组元素a[0],则p[i]代表a[i]。如果p指向一个整形数组元素a[2],则p[i]代表a[2+i]。
3、通过指针引用数组元素
(1)下标法,如a[i]形式;
(2)指针法:如*(a+i)或*(p+1)。其中a是数组名,p是指向数组元素的指针变量,其初值为p=a。
例:有一个整形数组a,有十个元素,要求输出数组中的全部元素。
(1)下标法:
(1)下标法
#include
intmain()
{int a[10];inti;
printf("please enter 10 integer numbers:");for(i=0;i<10;i++)
scanf("%d",&a[i]);for(i=0;i<10;i++)
printf("%d",a[i]);return 0;
}()
(2)通过数组名计算数组元素地址,找出元素的值。
#include
intmain()
{int a[10];inti;
printf("please enmter 10 integer numbers:");for(i=0;i<10;i++)
scanf("%d",&a[i]);for(i=0;i<10;i++)
printf("%d",*(a+i));//通过数组名和元素序号计算元素地址,在找到该元素return 0;
}
(3)用指针变量指向数组元素
#include
intmain()
{int a[10];int i,*p;
printf("please enmter 10 integer numbers:");for(i=0;i<10;i++)
scanf("%d",&a[i]);for(p=a;p
printf("%d",*p);//用指针指向当前的数组元素return 0;
}
分析:
C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址。第(1)和第(2)种方法执行效率是相同的,即都是先计算*(a+i),因此用第(1)和第(2)种方法找数组元素费时较多。
而第(3)种方法比第(1)、第(2)种方法快,用指针变量直接指向元素,不必每次都重新计算地址,因为像p++这样的自加操作是比较快的。
这种有规律地改变地址值(p++)能大大提高执行效率。这种方法能使程序简洁、高效。适合有经验的编程者。
但是下标法比较直观,能直接知道是第几个元素。这种方法比较直观、不易出错。适合初学者。
利用指针引用数组元素,比较灵活方便,有不少的技巧,请分析下面几种情况(设p开始时指向数组a的首元素(即p=a)):
(1)、
p++;*p;
分析:p++使p指向下一个元素a[1],若再执行*p,则得到下一个元素a[1]的值。
(2)、
*p++;
由于++和*同优先级,结合方向为自右向左,因此它等价于*(p++)。先引用p的值,实现*p的运算,然后再使用p自增1。
例:
for(i=0;i<10;i++,p++)
printf("%d",*p);
可以改写成for(i=0;i<10;i++)
printf("%d",*p++);