《C语言第十五讲(指针与数组).doc》由会员分享,可在线阅读,更多相关《C语言第十五讲(指针与数组).doc(12页珍藏版)》请在三一文库上搜索。
1、指针与数组 1掌握指向数组的指针及其运算。2掌握指向字符串的指针及其运算。 3掌握指针数组的概念和使用。 1. 指向数组的指针及运算 2指向字符串的指针及运算 (一)导课在C语言中,指针与数组关系密切,数组名代表整个数组存储区起始地址,而指针也是表示地址,所以把数组的起始地址或把某一数组元素的地址赋给指针变量,指针变量即指向了该数组的首地址或者数组元素,因此任何能用数组下标完成的操作都有可用指针来完成。(二)课程要点一、指向一维数组的指针变量将一维数组的名字或某一数组元素的地址赋给指针变量,指针变量即指向该一维数组或数组元素。例如:int a7, *p; p=a;定义一维数组a和指针变量p,通
2、过p=a;使p指向数组a的首地址,这时的*p就是a0的值。如右图所示。如果将数组元素a2的地址赋给变量p,即p=&a2;则指针变量p指向数组元素a2,这时的*p就是a2的值。如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。这里的p+1不是简单的将p值加1,而是p+1d,其中d是一个数组元素所占的字节数。如果p的初值是&a0,则p+3和a+3均表示a3的地址,如右图所示。 因此,引入了指针变量后,可以用两种方法来访问数组元素,下面通过例子说明。【例1】分别用下标法和指针法访问数组元素。#include void main() int a7=1,2,3,4,5,6,7;
3、int i,*p; 下标法for(i=0;i=6;i+)printf(%d,ai);printf(n);指针法 for(p=a;p=a+6;p+) printf(%d,*p);也可以用数组名计算数组元素的地址,或用带下标的指针变量来引用数组元素。将上面的程序改写如下:#include void main() int a7=1,2,3,4,5,6,7; int i,*p; p=a;用数组名计算数组元素的地址for(i=0;i=6;i+) printf(%d,*(a+i); printf(n); 用带下标的指针变量来引用数组元素for(i=0;i=6;i+) printf(%d,pi);二、指向多
4、维数组的指针变量C语言允许把多维数组分为多个一维数组来处理,以二维数组为例。如有定义:int a23=1,2,3,4,5,6; 数组名a代表二维数组的首地址,即二维数组0行的起始地址。二维数组名是指向行的。因此a+1代表第1行的首地址。而a0、a1可以分别看作是二个一维数组的数组名,是指向列元素的。因此它们分别代表第0行一维数组中的第0个元素的地址,即&a00,a0+1是0行1列元素a01的地址,由此ai+j是一维数组ai的第j列元素首地址,即等于&aij。则指向二维数组的指针对变量说明形式为:类型说明符 (*指针变量名)数组长度“类型说明符”为所指数组的数据类型。,“*”表示其后的变量是指针
5、类型。“数组长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。例如:int a23; int (*p)3; p=a;【例2】使用指针变量输出二维数组各元素的值。#include void main() int a23=1,2,3,4,5,6; int (*p)3; int i,j; p=a; for(i=0;i2;i+) for(j=0;j3;j+) printf(%3d,*(*(p+i)+j); printf(n); 上述程序也可作如下修改: #include void main() int a23=1,2,3,4,5,6; int *p; int i,j; p=
6、a; for(i=0;i2;i+) p=ai; for(j=0;j3;j+) printf(%3d,*p); p+; printf(n); 【例3】运用指向二维数组的行指针变量,计算4名同学3门功课的总平均分。#include void main()float score43=67,89,90,87,77,91,69,96,78,79,86,90;float(*p)3,sum=0,aver;int i,j;p=score;for(i=0,i4;i+) for(j=0,j3;j+) sum+=*(*(p+i)+j);aver=sum/12;printf(“average=%5.1fn”,aver
7、);三、指针与字符串字符串在C语言中是用字符数组存放的,也可以用字符指针指向字符串,然后通过指针变量对字符串进行访问。例如:char str=hello,*p;p=str;也可以定义为:char *str=hello;虽然没有定义存放字符串常量的字符数组,但系统在内存中还是将该字符串作为字符数组来处理的,即开辟一片连续的存储空间存放字符串。下面的程序用于输出字符串hello。程序运行结果:hellomain() char *str=hello; printf(%sn,str);如果将输出语句改为:printf(%sn,str+3);输出结果为:lo如果将输出语句改为:printf(%cn,*s
8、tr);输出结果为:h【例4】运用指针变量,把字符串a复制到字符串b中。 #include void main() char *a=this is a book; char b20,*p,*q; p=a;q=b; while(*p!=0) *q=*p; p+; q+; *q=0; printf(%sn,a); printf(%sn,b);【例5】在输入的字符串中查找有无a字符。#include void main() char str20,*p; int i; printf(input a string:); p=str; scanf(%s,p); for(i=0;pi!=0;i+) if(pi=a) printf(there is a a in the string.n); break; if(pi=0) printf(There is no a in the string.n);