《C语言程序设计》课件——39一维数组的指针表示法.ppt
一维数组的地址表示法数组名下标法地址法9.3一维数组的指针表示方法
9.3.1一维数组的地址表示法(地址法)
定义一个含有5个元素的一维数组a如下:
inta[5]={1,3,5,7,9};
它在内存中的分配情况如下图所示。
例如:a+1的实际地址为:1010+1*2=1012
a[3]的实际地址为:1010+3*2=1016例如,通过a+3的地址可以找到a[3]元素,*(a+3)就是a[3]元素的值。因此下面二者等价:a[i]----下标法*(a+i)----地址法9.3.2一维数组的指针表示法
定义一个指针变量,并把这个指针指向该数组的起始地址,那么通过对指针的运算,就可以完成对数组的访问,这种方法被称为指针法。例如:
inta[5]={1,3,5,7,9},*ip;
ip=a;
++ip;【例9.3.1】分别用下标法、地址法、指针法访问数组元素。
#includestdio.h
main()
{inta[5]={1,3,5,7,9},i,*p;
for(i=0;i5;i++)printf(“%d”,a[i]);/*下标法*/
printf(“\n”);
for(i=0;i5;i++)printf(“%d”,*(a+i));/*地址法*/
printf(“\n”);
for(p=a;pa+5;p++)printf(“%d”,*p);/*指针法*/
}
9.3.3使用指针法应注意的问题
(1)在下标法、地址法、指针法3种方法中,指针法的效率最高。
(2)在使用指针访问数组元素时,系统不作“下标是否越界”的检查。
(3)使用指向数组元素的指针变量时,应当注意指针变量的当前值。
例如:
p=a;
for(i=0;i5;i++)scanf(%d,p++);
9.3.4应用指针法举例
【例9.5】从键盘输入若干天的温度值,求平均温度。要求用数组存放输入的若干个温度值,当输入完全部需要处理的温度值后,输入“0”表示输入结束,然后对已输入的温度求平均值。
用地址法编写程序如下:
main()
{floatt[31],s=0;
intn,d=0;/*d为输入数据计数值,n为实际输入的有效数据量*/
do{printf(请输入第%d天的温度值:,d+1);
scanf(%f,t+d);
}while(*(t+d++)!=0);
n=d-1; /*剔除输入的0*/
for(d=0;dn;d++)s+=*(t+d);/*统计n个数据的和值*/
printf(平均温度为:%4.1f,s/n);
}
可以用指针法改写上述程序,改动后的源程序如下:
main()
{floatt[31],s=0,*p=t;
intn,d=0;/*d为输入数据计数值,n为实际输入的有效数据量*/
do{printf(请输入第%d天的温度值:,++d);
scanf(%f,p);
}while(*(p++)!=0);
n=d-1; /*剔除输入的0*/
for(p=t;pt+n;p++)s+=*p; /*统计n个数据的和值*/
printf(平均温度为:%4.1f,s/n);
}
在程序中定义一个数组后,编译系统就会为它分配一个可以容纳数组中所有元素的存贮区,其中数组名代表这个数组的起始地址。那么在C语言中,数组各元素的地址是如何表示和计算的呢?下面讨论一下一维数组的地址表示法。引用一个数组元素,可以用两种不同的方法。一种是前面已经介绍的下标法,即指出数组名和下标值,系统就会找到该元素,如a[3]就是用下标法表示的数组元素。另一种是地址法,即通过相应的地址访问数组的某一元素。例如,通过a+3的地址可以找到a[3]元素,*(a+3)就是a[3]元素的值。因此下面二者等价:对于上面定义的数组,a的值就是数组a的起始地址(假设为1010),由于已定义数组a为整型数组,则a[0]的地址值也是a的值(1010),a[1]的地址可以用a+1表示,也就是说a+1指向数组a中下标为1的元素。同样,a+i是a[i]的地址。需要说明的是:在编译系统计算实际地址时,a+i中的i要乘上数组中每个元素所占的字节数,即:a+i*n(n为一个元素所