资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第七章第七章 指指 针针【学习目标】(1)能够使用指针。 (2)理解指针、数组、字符串间的密切关系。 (3)能够使用指针通过按引用调用向函数传递参数。 (4)理解如何使用函数指针。 指针是C语言中一种重要的数据类型,也是C语言的精华。正确而灵活地运用它,可以处理各种复杂的数据结构,能使程序简洁、紧凑、高效。每一位学习和使用C语言的人,都应当深入地学习和掌握指针。本章将介绍指针的基础知识和指针的使用方法。 指针的概念比较复杂,使用也比较灵活,因此初学时应多思考、多比较、多上机,在实践中掌握它。 7.1 指针的概念对程序中定义的某个变量,编译时根据它的数据类型给它分配一定长度的内存空间。如整型变量分配2个字节,字符型变量1个字节,双精度变量分配8个字节内存中的每个字节都被按顺序进行编号,就好像旅馆中的每个房间和它的房间号,我们把每个字节的编号叫做该字节的地址。在地址所对应的单元存放数据,就相当于旅馆客房中住旅客一样。 迄今为止,我们的操作对象是基本类型和数组类型的变量,这些变量都存放具体的变量值,要标识的和处理的对象也都是变量本身。然而在不少使用场合,例如,系统程序设计中必须涉及到对变量存放地址的加工,通过地址获得存放于地址中的变量本身。 7.1.1 内存的访问方式对内存变量的存取有两种方式:直接访问、间接访问。1. 直接访问 每个变量对应自己的地址,数据输出就是根据变量和地址的对应关系找到变量地址,然后从地址中取出数据。数据输入就是将值送到变量所在存储单元中。如图7-1所示,i=2、j=6、k=8通过变量i、j、k来访问存储单元。 2. 间接访问 将变量对应的地址放入另一个存储变量中,输出数据时先找到存放地址的单元地址,从中取出地址,然后到该地址所指单元取出数据。如图7-1所示,如变量i,不知道其值及地址,而只知道它的地址放在3000、3001中,因此可通过存放地址的单元找到变量i的对应地址2000,再由地址2000找到最终要访问的变量i的值2。 页码,1/18第七章 指 针2010-5-31http:/www.cdvtc.com/jpkc/cyy/wlkt/7.htm对间接访问,可定义一变量存放地址,如定义变量i_pointer, 赋值i_pointer= 【说明】 定义中的标识符就是变量名,“*”表示其后的变量为指针变量。 一个指针变量只能指向同一个类型的变量,即只能存放同一类型变量的地址。 例如: int a,b; /*定义两个整型变量a和b*/ int *p1,*p2; /*定义两个指向整型变量的指针变量p1和p2*/ float *p3; /*定义一个指向实型变量的指针变量p3*/ char *p4; /*定义一个指向字符型变量的指针变量p4*/ 一个指针变量定义后,就可以用来存放变量地址了。但刚刚定义的指针变量未经赋值时,并不指向任何变量,要想使它有确定的指向,必须将变量的地址赋给该指针变量。 例如: int a=2; int *p; p= 内存用户数据区 2000 2 变量i 2002 6 变量j 2004 8 变量k 3000 2000 变量i_pointer 图7 1 变量存放示意图p a p a 2 ”(指针变量p得到变量a的地址)后,指针变量p才指向变量a,如图7-2所示。 7.2.2 指针变量的引用指针变量定义后就可以对它进行赋值、输出值、访问其所指向的变量等操作。但请注意:指针变量只能存放地址,不要将非地址类型的数据赋值给一个指针变量。 1. 指针运算符 指针运算符有如下两个: (1) /*定义两个整型变量a和b*/ int *p1, *p2; /*定义两个指向整型变量的指针变量p1和p2*/ a=50; b=10; p1= /*把变量a的地址赋给p1,使p1指向变量a*/ p2= /*把变量b的地址赋给p2,使p2指向变量b*/ printf(“%d, %d n“, a, b); /*输出变量a和b的值*/ printf(“%d, %d n“, *p1, *p2); /*输出p1、p2所指向的变量的值*/ 运行结果为: 50, 10 2. 指针运算符的运算法则 结合性。自右向左。 若:int a, b, *p1, *p2; p1= p2= 则: p= a=3; 则:“(*p)+;”相当于“a+;”,即语句执行结果是a的值为4,p仍指向变量a。 “*p+;”相当于“*(p+);”先执行*p,即取出a的值3,然后p值增1,即p不再指向变量a,而是a的下一个存储单元。 【例7-2】交换两个指针变量的指向。 main( ) int *p1, *p2, a, b, *p; 图 7-2 页码,3/18第七章 指 针2010-5-31http:/www.cdvtc.com/jpkc/cyy/wlkt/7.htmp1 a *p1 c *p2 b *p2 p1= p2= printf (“n%d,%dn“, *p1, *p2); if (ab) swap( printf (“na=%d,b=%dn“, a, b); swap(int *pa,int *pb) int t; t=*pa; *pa=*pb; *pb=t; 运行结果:键盘输入10,50 a=50,b=10 该程序中,变量的地址作实参,利用指针变量作形参接受实参传递过来的变量地址,使得形参pa和pb分别指向对象a和b,函数swap( )执行后,pa和pb指向的对象的值被交换了,也就是变量a和b的值被交换了,如图7-5所示。 int *p, *q; scanf(“%d, %d“, p= q= if (ab)swap(p, q); printf (“na=%d,b=%dn“, a, b); swap(int *pa,int *pb) int t; t=*pa; *pa=*pb; *pb=t; 指针变量做实参也是值传递,但是由于指针变量中存放的是地址,因而传递给形参的是所指对象的地址,从而实现了两个变量值的交换,如图7-6所示。 通过以上分析可知,要想通过函数调用得到n个要改变的值,可以用以下思想方法: 在主调用函数中设置n个变量,并且用n个指针变量指向它们; 然后将指针变量作实参,将这n个变量的地址传给所调用的函数的形参; 通过形参指针变量改变该n个变量的值; 主调用函数中就可以使用这些改变了值的变量。 【例7-6】输入a、b、c三个整数,按大小顺序输出。 /*排序输出3个数的程序T706.C*/ void swap (int *pt1, int *pt2) int p; p=*pt1; *pt1=*pt2; *pt2=p; void exchange(int *q1, int *q2, int *q3; ) if(*q1max)max=*p; else if (*pmin)min=*p; return; main( ) int i,number10; printf(“enter 10 integer numbers:n“); for(i=0;i10;i+) scanf(“%d“, max_min_value(number,10); printf(“nmax=%d,min=%dn“,max,min); 【说明】 在函数max_min_value中求出的最大值和最小值放在max和min中。由于它们是全局变量,因此在主函数中可以直接使用。 函数max_min_value中的语句: max=min=*array; array是数组名,它接收从实参传来的数组numuber的首地址。*array相当于*(“等价。 在执行for循环时,p的初值为array+1,也就是使p指向array1。以后每次执行p+,使p指向下一个元素。每次将*p和max与min比较,将大者放入max,小者放min。 函数max_min_value的形参array可以改为指针变量类型。实参也可以不用数组名,而用指针变量传递地址。 7.3.3 字符串指针变量字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。对指向字符变量的指针变量应赋予该字符变量的地址。如: char *s=“C Language“; 表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。它等效于: char *s; s=“C Language“; 【例7-13】输出字符串中第n个字符后的所有字符。 /*输出字符串中第n个字符后的所有字符的程序T713.C*/ main( ) 页码,12/18第七章 指 针2010-5-31http:/www.cdvtc.com/jpkc/cyy/wlkt/7.htm char *ps=“this is a desk “; int n=10; ps=ps+n; printf(“%sn“,ps); 运行结果为: desk 在程序中对ps初始化时,即把字符串首地址赋予ps。执行ps= ps+10之后,ps指向字符“d”,因此输出为“desk”。 【例7-14】使用指针变量指向一个格式字符串,用于在printf函数中输出二维数组的各种地址表示的值。 /*利用指针变量在printf函数中输出二维数组的各种地址表示的程序T714.C*/ main( ) static int a34=0,1,2,3,4,5,6,7,8,9,10,11; char *PF; PF=“%d, %d, %d, %d, %dn“; printf(PF,a,*a,a0, printf(PF,a+1,*(a+1),a1, printf(PF,a+2,*(a+2),a2, printf(“%d,%dn“,a1+1,*(a+1)+1); printf(“%d,%dn“,*(a1+1),*(*(a+1)+1); 在printf语句中用指针变量PF代替了格式串。这是程序中常用的方法。 【例7-15】使用字符串指针作为参数,把一个字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。 /*利用字符串指针复制字符串的程序T715.C*/ cpystr(char *pss,char *pds) while(*pds=*pss)!=0) pds+; pss+; main( ) char *pa=“CHINA“,b10,*pb; pb=b; cpystr(pa,pb); printf(“string a=%snstring b=%sn“,pa,pb); 在本例中,程序完成了两项工作:一是把pss指向的源字符串复制到pds所指向的目标字符串中。二是判断所复制的字符是否为“0”,若是则表明源字符串结束,不再循环;否则,pds和pss都加1,指向下一字符。在主函数中,以指针变量pa、pb为实参,分别取得确定值后调用cprstr函数。由
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号