C语言教程第六章:指针(3)


数组指针变量的说明');和运用

  指向数组的指针变量称为数组指针变量。 在驳斥冲突数组指针变量的说明');和运用之前,我们先懂得几个关连。
一个数组是由延续的一块内存单位构成的。 数组名就是这块延续内存单位的首地点。一个数组也是由各个数组元素(下标变量) 构成的。每个数组元素按其圭臬规范不合占有几个延续的内存单位。 一个数组元素的首地点也是指它所占有的几个内存单位的首地点。 一个指针变量既可以指向一个数组,也可以指向一个数组元素, 可把数组名或第一个元素的地点赋予它。如要使指针变量指向第i号元素可以把i元素的首地点赋予它或把数组名加i赋予它。

  设有实数组a,指向a的指针变量为pa,从图6.3中我们可以看出有以下关连:
pa,a,&a[0]均指向不合单位,它们是数组a的首地点,也是0 号元素a[0]的首地点。pa 1,a 1,&a[1]均指向1号元素a[1]。类推可知a i,a i,&a[i]
指向i号元素a[i]。应该说明');的是pa是变量,而a,&a[i]都是常量。在编程时应予以看重。
main(){
int a[5],i;
for(i=0;i<5;i ){
a[i]=i;
printf("a[%d]=%d\n",i,a[i]);
}
printf("\n");
}
主函数
界说一个整型数组和一个整型变量
循环语句
给数组赋值
打印每一个数组的值
......
输入换行
......
数组指针变量说明');的通俗情势为:
圭臬规范说明');符 * 指针变量名
  其中圭臬规范说明');符阐扬剖析所指数组的圭臬规范。 从通俗情势可以看出指向数组的指针变量和指向通俗变量的指针变量的说明');是雷同的。
引入指针变量后,就可以用两种方式来碰面数组元素了。
  第一种方式为下标法,即用a[i]情势碰面数组元素。 在第四章中先容数组时都是采取这种方式。
  第二种方式为指针法,即采取*(pa i)情势,用直接碰面的方式来碰面数组元素。
main(){
int a[5],i,*pa;
pa=a;
for(i=0;i<5;i ){
*pa=i;
pa ;
}
pa=a;
for(i=0;i<5;i ){
printf("a[%d]=%d\n",i,*pa);
pa ;
}
}
主函数
界说整型数组和指针
把指针pa指向数组a
循环
把变量i的值赋给由指针pa指向的a[]的数组单位
把指针pa指向a[]的下一个单位
......
指针pa从头取得数组a的首地点
循环
用数组方式输入数组a中的全数元素
把指针pa指向a[]的下一个单位
......
......
上面,另举一例,该例与上例本意雷同,然则完成方式不合。
main(){
int a[5],i,*pa=a;
for(i=0;i<5;){
*pa=i;
printf("a[%d]=%d\n",i ,*pa );
}
}
主函数
界说整型数组和指针,并使指针指向数组a
循环
把变量i的值赋给由指针pa指向的a[]的数组单位
用指针输入数组a中的全数元素,同时指针pa指向a[]的下一个单位
......
......

数组名和数组指针变量作函数参数

  在第五章中已经先容过用数组名作函数的实参和形参的成绩。在进修指针变量之后就更随意草率懂得这个成绩了。 数组名就是数组的首地点,实参向形参传送数组名理想上就是传送数组的地点, 形参取得该地点后也指向不合数组。 这就好象不合件物品有两个互相不合的称号一样。异样,指针变量的值也是地点, 数组指针变量的值即为数组的首地点,虽然也可作为函数的参数运用。
float aver(float *pa);
main(){
float sco[5],av,*sp;
int i;
sp=sco;
printf("\ninput 5 scores:\n");
for(i=0;i<5;i ) scanf("%f",&sco[i]);
av=aver(sp);
printf("average score is %5.2f",av);
}
float aver(float *pa)
{
int i;
float av,s=0;
for(i=0;i<5;i ) s=s *pa ;
av=s/5;
return av;
}

指向多维数组的指针变量

本大节以二维数组为例先容多维数组的指针变量。

一、多维数组地点的阐扬剖析方式
设有整型二维数组a[3][4]如下:
0 1 2 3
4 5 6 7
8 9 10 11
  设数组a的首地点为1000,各下标变量的首地点及其值如图所示。在第四章中先容过, C语言许可把一个二维数组分解为多个一维数组来处理责罚。是以数组a可分解为三个一维数组,即a[0],a[1],a[2]。每一个一维数组又含有四个元素。例如a[0]数组,含有a[0][0],a[0][1],a[0][2],a[0][3]四个元素。 数组及数组元素的地点阐扬剖析如下:a是二维数组名,也是二维数组0行的首地点,等于1000。a[0]是第一个一维数组的数组名和首地点,是以也为1000。*(a 0)或*a是与a[0]等效的, 它阐扬剖析一维数组a[0]0 号元素的首地点。 也为1000。&a[0][0]是二维数组a的0行0列元素首地点,异样是1000。是以,a,a[0],*(a 0),*a,&a[0][0]是相等的。同理,a 1是二维数组1行的首地点,等于1008。a[1]是第二个一维数组的数组名和首地点,是以也为1008。 &a[1][0]是二维数组a的1行0列元素地点,也是1008。是以a 1,a[1],*(a 1),&a[1][0]是一致的。 由此可得出:a i,a[i],*(a i),&a[i][0]是一致的。 其它,&a[i]和a[i]也是一致的。因为在二维数组中不克不及把&a[i]懂得为元素a[i]的地点,不存在元素a[i]。

  C语言划定,它是一种地点较劲争论方式,阐扬剖析数组a第i行首地点。由此,我们得出:a[i],&a[i],*(a i)和a i也都是一致的。别的,a[0]也
可以看成是a[0] 0是一维数组a[0]的0号元素的首地点, 而a[0] 1则是a[0]的1号元素首地点,由此可得出a[i] j则是一维数组a[i]的j号元素首地点,它等于&a[i][j]。由a[i]=*(a i)得a[i] j=*(a i) j,因为*(a i) j是二维数组a的i行j列元素的首地点。该元素的值等于*(*(a i) j)。
[Explain]#define PF "%d,%d,%d,%d,%d,\n"
main(){
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
printf(PF,a,*a,a[0],&a[0],&a[0][0]);
printf(PF,a 1,*(a 1),a[1],&a[1],&a[1][0]);
printf(PF,a 2,*(a 2),a[2],&a[2],&a[2][0]);
printf("%d,%d\n",a[1] 1,*(a 1) 1);
printf("%d,%d\n",*(a[1] 1),*(*(a 1) 1));
}




版权声明: 原创作品,许可转载,转载时请务必以超链接情势标明文章 原始因由 、作者信息和本声明。不然将清查执法责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1975592.html