预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共38页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第十五讲8.3通过指针引用数组由于数组名可以代表数组的首地址。因此,下面的两种表示是等价的: a,&a[0]数组的指针:数组的首地址。 一维数组的指针:一维数组的首地址,也就是一维数组中第一个元素的地址。 C语言规定:数组名代表数组的首地址。 若有:inta[10]; 则:a与&a[0]是等价的 数组元素的指针:数组元素的地址。 指向一维数组元素的指针变量:存放一维数组首地址或数组元素地址的变量。一维数组的首地址加上偏移量x即可得到其他数组元素的地址。 例如:inta[10],*p; p=a;/*等价于p=&a[0]*/ 则有: &a[1]等价于a+1或p+1 &a[i]等价于a+i或p+i 注意:p+i指向数组的第i个元素,而不是简单地使指针变量p的值加i。其所代表的地址实际上是p+i×size(size为一个数组元素所占的字节数)。#include"stdio.h" main() {inta[4]={1,2,3,4},i; for(i=0;i<4;i++) printf("a[%d]=%d",i,*(a+i)); printf("\n");} 运行结果为: a[0]=1a[1]=2a[2]=3a[3]=4 内存中的值 a→a[0] 1 ←*a a+1→a[1] 2 ←*(a+1) a+2→a[2] 3 ←*(a+2) a+3→a[3] 4 ←*(a+3) 数组名a表示该数组的首地址,通过数组名a可以得到其它元素的地址。数组名就是数组的指针。 —个数组的名字实际上是一个指针表达式,所以数组名a就是一个指向数组a中第1个元素的指针,当计算中出现a[i]时,c编译立刻将其转换成*(a+i),这两种形式在使用上是等价的,因此,例中的*(a+i)实际上就是a[i]。访问一个数组元素主要有两种形式: 下标法:用a[i]的形式存取数组元素。 指针法:用*(a+i)或*(p+i)的形式存取数组元素。其中a是一维数组名,p是指向数组元素的指针变量。p的初值为数组a的首地址,可以通过指针变量赋值或加/减一个整数使p指向不同的数组元素。例通过下标法存取数组元素 #include<stdio.h> voidmain(){ inta[10],i; for(i=0;i<10;i++)scanf("%d",&a[i]); for(i=0;i<10;i++)printf("%5d",a[i]); printf("\n");}例通过数组名计算元素地址存取数组元素 #include<stdio.h> voidmain(){ inta[10],i;for(i=0;i<10;i++)scanf("%d",a+i); for(i=0;i<10;i++)printf("%5d",*(a+i)); printf("\n");}4.当情况复杂时,注意分析: 若有以下说明, intarray[7]={1,2,3,4,5,6,7}; 则array[*(array+array[3]+1)]的值为: 注意: 1.指针变量可以实现使本身的值改变,但数组名不行。p=a+3;p++;但a=p+3;a++是错误的。2.注意指针的当前值 int*p,i,a[10]; p=1; for(i=0;i<10;i++) scanf(%d”,p++); for(i=0;i<10;i++) printf(%d”,*p);3.注意指针变量的运算(p=array) p++;*p *p++*(p++)先取出*p值,后使p+1 *++p*(++p)先使p+1,后取出*p值 (*p)++p指向的元素值加1 数组名是一个常量,不允许重新赋值。 p+i和a+i均表示数组元素a[i]的地址,均指向a[i]。 *(p+i)和*(a+i)均表示p+i和a+i所指对象的内容,即a[i]。 *p++等价于*(p++),其作用是先得到*p,再使p=p+1。用指针法访问数组元素的注意事项: (*p)++:表示将p所指向元素的值加1。 例如: inta[5]={0,2,4,6,8},*p; p=a+2; (*p)++; printf("%d\n",*p); 程序段输出结果为:5例分析下面程序的输出结果 #include<stdio.h> voidmain() { inta[5]={0,2,4,6,8},*p,i; p=a;(*p)++; p=a+1;++(*p); p=a+2;(*p)--; p=a+3;--(*p); for(i=0;i<=4;i++) printf("%5d",a[i]); printf("\n"); }[]实际上是变址运算符,即编译时是将数组元素a[i]处理成*(a+i)的。因此指向数组元素的指针变量也可带下标。 例如:*(p+i)可以表示成p[i]。 注意:如果p不指向a[0],则p[