收藏 分享(赏)

第7章_指针-2010.ppt

上传人:dreamzhangning 文档编号:3316119 上传时间:2018-10-12 格式:PPT 页数:69 大小:1.01MB
下载 相关 举报
第7章_指针-2010.ppt_第1页
第1页 / 共69页
第7章_指针-2010.ppt_第2页
第2页 / 共69页
第7章_指针-2010.ppt_第3页
第3页 / 共69页
第7章_指针-2010.ppt_第4页
第4页 / 共69页
第7章_指针-2010.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

1、第7章 指针,华北电力大学 控制与计算机,高级语言程序设计(C ),C程序设计中使用指针可以: 有效地表示复杂的数据结构链表等 动态分配内存malloc函数和free函数 调用函数时,可以得到多于一个的值,-3-,教学目标 1、掌握变量的两种访问方式 (1)用变量名直接访问变量 (2)用指针变量间接访问变量 2、掌握一维数组的两种访问方式 (1)用下标变量直接访问一维数组的元素 (2)用指针变量间接访问一维数组的元素 3、掌握二维数组的两种访问方式 (1)用双下标变量直接访问二维数组的元素 (2)用指针变量间接访问二维数组的元素,7.1 指针的概念,变量与地址,程序中: short int i

2、; float k;,内存中每个字节有一个编号 地址,i,k,-5-,short a,b,c; a=1; b=2; c=a+b;,直接访问,程序片段,利用变量名,直 接存取变量值的方式 称为“直接访问”。,变量的直接访问与间接访问,-6-,C 语言提供对内存单元的 “间接访问”,p_c,2008,*p_c=a+b操作将a和b相加的结果,存放到变量p_c所指出的地址中去。,3,short int a=1,b=2,c ,*p_c;p_c = ,间接访问,通过指向变量的指针变量访问变量,-7-,指针与指针变量,2008,指针变量,变量的内容,变量的地址,指针:一个变量的地址,指针变量:专门存放指针(

3、地址)的变量,指针,-8-,void main() short int a,*p;a=10;p= ,运行结果: a:10 p:ffcc,例 指针的概念,一、指针变量的定义 定义形式:类型说明符 *标识符;,7.2 指针变量的说明和指针运算符,指针变量指向的变量的数据类型,表示指针变量,int *pt_1 ; char *pt_2 ; float *pt_3 ;说明 pt_1只能存放int型变量的地址。 pt_2只能存放char型变量的地址。 pt_3只能存放float型变量的地址。,-10-,指针变量的要素: 指针变量名(与一般变量相同,但说明时要加*号) 指针变量的类型:类型说明符 * 指针

4、变量的值:某个变量在内存中的地址,简称变量的内存地址 指针变量一旦存放了某个变量的地址后,指针变量指向的目标变量就是该变量float a,*p= (间接访问),指针变量p一旦存放了某个变量a的地址,则变量a就有了另一个别名*p,二、指针运算符,两个有关的运算符(右结合性 )(1) & 取地址运算符,只作用于变量(2) * 取目标运算符,只作用于地址。,结论:*pt相当于a (*pt)+相当于a+ &*pt相当于&a相当于pt*&a相当于*pt相当于a,a=1;,例:int a, *pt; pt=,-12-,已知 int i= 0,j=1,* p,* q ;p = q = & j ; 判断下面语

5、句的正误。A) i= * & j ; B) p = & * & i ; C) j = (* p)+ ; D) i = * & q ;,&j是变量j的地址,* &j是变量j,& * & i等价于&i,是变量i的地址。,p 是变量i的地址,* p是变量i。,q 是变量j的地址,&q是变量q的地址。,-13-,指针变量的赋值运算 使用取地址符 不能把一个整数p,也不能把p的值整型变量,如 int i, *p;p=1000; i=p;,-14-,指针变量的初始化 一般形式 数据类型 * 指针名=初始地址值;,例 int i;int *p=,变量必须已说明过 类型应一致,例 int i;int *p=,

6、用已初始化的指针变量作初值,例 int *p=,int i; float *p=,-15-,例1:读程序,写结果。 #include void main( ) int x,*px;px= printf(“%dt%dn”,x,*px); ,运行结果为: 16 16,16,-16-,指针的值为零时称该指针为空指针 (NULL)。,空指针和悬挂指针,指针变量的值为随机值时,称它为悬挂指针。,如:int *px=NULL;/px为空指针*px=3;/报错,如:int *px;/*表示什么*px=3; /*表示什么px为悬挂指针(危险),-17-,void *类型指针 表示: void *p; /p为通

7、用型指针变量 使用时要进行强制类型转换 如:void *p;p=(double *)malloc(sizeof(double);*p=34.5;p=(int *)malloc(sizeof(int);*p=20;其中:函数malloc的功能是动态申请存储空间,表示不指定p是指向哪一种 类型数据的指针变量,-18-,例 void main( ) short int i=10;short int *p;*p=0;printf(“%hd”,*p);,例 void main( ) short int i=10;short int *p;p=,指针变量必须先赋值,再使用,危险!,*p,-19-,#inc

8、lude void main() short int *p1,*p2,*p, a, b;scanf(“%d,%d“, ,运行结果: a=5,b=9 max=9,min=5,5,2006,9,2008,2008,2006,例: 输入两个数,从大到小输出(用指针变量完成),-20-,例:求三个数中的最大值。(用指针变量实现),#include void main() int a,b,c,max,*pa, *pb ,*pc;pa= ,-21-,总结 用指针变量间接访问变量的步骤 (1)定义指针变量 (2)将要访问变量的地址存放到指针变量中,则指针变量就指向了要访问的变量 (3)用(*指针变量)的形式

9、访问即可,-22-,数组元素是内存的一个存储单元,故指向数组元素的指针变量的性质和指向变量的指针变量是一样的。int a10;int * p = ,执行语句:p=,7.3 指针与一维数组,一维数组的指针:一维数组的起始地址(首元素地址) 一维数组元素的指针:是一维数组元素的地址,一、指向数组元素的指针变量,1,-23-,例: int a10, *p;p=a;则p+1 指向?则p+5 指向?则p+9 指向?,二、指针的算术运算,当指针变量p指向数组中的元素时,指针的算术运算才有意义,pi或pi表示数组元素的地址 (i为整型数),P为指针变量,并且已经指向了某个数组元素。,注意:p+i不改变p中的

10、值,-24-,指针与数组,二、指针的算术运算(续),例 int a10;int *p=a ;p+; /* p=p+1; */*p=1;p+;p+=5;p-;,p+, p-, p+=i, p-=i等,P为指针变量,并且已经指向了某个数组元素。,注意:p+、p-、p+=5改变p中的值,-25-,二、指针的算术运算(续),p1+p2无意义.,例 int a10;int *p1=,若p1与p2指向同一数组,p1-p2为两指针间的元素个数,#include void main( ) int a=1,2,3,4,5,6 ;int * p;p = a;printf(“ % d”,* p);printf(“

11、% dn”,*(+ +p );printf(“ % d”,* + +p);printf(“ % dn”,*(p- -);p + = 3;printf(“ %d %dn”,* p,*( a + 3 ); ,2,3,3,5,4,前置运算和后置运算,-27-,指针与数组,三、指针的关系运算 若p1和p2指向同一数组,则 p1p2 表示p1指的元素在后 p1=p2 表示p1与p2指向同一元素,当p1、p2指向同一数组中的元素时,关系运算才有意义,指针可以和零之间进行 等于或不等于的关系运 算, 即p=0或p!=0。 用于判别指针p是否为 一个空指针。,四、引用一维数组元素的方式,p0 p1 p2 p3

12、pi. p9,数组元素的表示方法: ai,*(a+i),pi,int a10 , *p ; p=a;,*(p+i),一维数组名和指向一维数组的指针变量的区别: 指针变量p是变量可以赋值, 数组名a是地址常量不能赋值。 一维数组元素的四种引用方式的条件: 只要定义一维数组a,就可以用ai或*(a+i) 定义一维数组a和指针变量p,并且p=a;则可以采用*(p+i)或pi,下标法 void main ( ) int a10;int i;for (i=0;i10;i+)scanf(“%d“,数组名计算地址法 void main ( ) int a10;int i;for (i=0;i10;i+)sc

13、anf(“%d“,a+i);printf(“n“);for (i=0;i10;i+)printf(“%3d“,*(a+i);,例:输入输出整型数组a的全部元素。(假设有10个元素),指针法1 void main( ) int a10, i, *p ;p=,指针法2 void main( ) int a10, i, *p ;p=a;for(i=0;i10;i+)scanf(“%d“, p+i );printf(“n“); for (i=0;i10;i+)printf(“%3d“, pi );,例:输入输出整型数组a的全部元素。(假设有10个元素),指针法1 void main( ) int a1

14、0, i, *p ;p=,a0,a9,P,-31-,void main() int i,*p,a10;p=a;for(i=0;i10;i+)scanf(“%d“,p+);printf(“n“);for(i=0;i10;i+)printf(“%d“,*(p+); ,p=a;,例:注意指针的当前值,10,9,8,7,6,5,4,3,2,1,1 2 3 4 5 6 7 8 9 10 ,-36 285 1 38 22 34 0 14914 124 9,-32-,例2:读程序,写结果。void main( ) int a10,*p1,*p2,i;for(i=0;i=9;i+) ai=10*i;p1=a;

15、 p2= printf(“%d ”, (*p2)+ ); printf(“%dn”,*p2+ );,输出结果:,30,50,51,51,52,在使用指针变量时要注意的问题1.数组名是数组的首地址,因此 p=&a0与p=a等价。2.指针变量可以实现使本身的值改变,数组名不可以。p+ 正确 a+ 不正确3指针变量可以指到数组后面的内存单元。在使用时,应避免越界。4要注意指针变量的当前值。,-34-,int a=1,2,3,4,5,6,7,8,9,10,*p=a,i;数组元素地址的正确表示: (A)&(a+1) (B)a+ (C)&p (D)&pi,例 注意指针变量的运算,-35-,例 void m

16、ain() int a=5,8,7,6,2,7,3;int y, *p=a+1;y=(*-p)+;printf(“%d ”,y);printf(“%d”,a0);,输出:5 6,6,指针与数组,-p; y=*p; (*p)+;,-36-,例:找出数组a中的最大值和最小值。,#include void main ( ) int i , a10,*p=a,max,min;for (i=0;imax) max=*p; if (*pmin) min=*p;printf(“max=%d,min=%d“,max,min);,-37-,例:将数组a10中10个整数按相反顺序存放。,互换的数组元素的下标关系:

17、 两者之和为9; 若一个为ai,另一个为a9-i.,-38-,#include void main ( ) int a10=3,7,9,11,0,6,7,5,4,2;int *p1, *p2, t;p1=a; p2=a+9;for (;p1p2; p1+,p2-)t=*p1;*p1=*p2;*p2=t;for (p1=a;p1a+10;p1+) printf(“%3d“,*p1); ,指针法,-39-,已知10个整数,将任意一个整数按指定的位置插进去。输出插入后的结果。(数据从键盘输入) 已知5个从小到大排序的实数,将任意一个实数按原来的顺序插进去。输出插入后的结果。(数据用初始化的方法) 对

18、任意一组实数,将指定位置的数据删除,输出删除后的结果。 (数据从键盘输入) 将任意一组实数逆序存放并显示。 已知10个整数,任意给定一个整数。输出查找的结果。(顺序查找) 已知10个从小到大排序的整数,任意给定一个整数。输出查找的结果。(折半查找),所有题目用指针变量完成,-40-,p,一、字符数组与指针void main() char string8=“china“;printf(“%sn“,string);,void main() char string8=“china“ ,*p;p=string;*p=C; /*等价于string0= C/*printf(“%sn“,p); ,china

19、,China,C,7.4 指针与字符串,2.字符串与指针void main()char *p;p=“China“;printf(“%sn“,p); ,二、字符串指针的使用 puts(p); gets(p) p+=3; printf(“%s”, p); *p? *(p+1)=d;,China,char *p=”China”;,na,d,-42-,void main() char *p;gets(p);puts(p); 思考:程序有错吗?,void main() char c10,*p=c;gets(p);puts(p); 思考:程序有错吗?,注意:读写字符串都必须提供字符串的起始地址,下面程序的

20、运行结果为: # include # include void main ( ) char *aa=“then“,*bb=“than“;aa+=2; bb+=2;printf(“%dn“,strcmp(aa,bb); A、有语法错 B、大于零的数 C、等于零 D、小于零的数,-44-,该程序的功能是将两个字符串连接后输出。,void main ( ) char s120, s210;char *p1=s1,*p2=s2;gets(p1); gets(p2);while(*p1!=0) p1+; for (;*p2!=0;p1+,p2+) *p1=*p2;*p1=0;/*p1、p2在哪*/pri

21、ntf (“s1:%sn”,s1); ,s1,s2,0,p1,p2,G,F,E,运行结果: ABCDEGF,该程序的功能是什么,void main ( ) char a20=“I am a teacher“, b20, *p1,*p2;p1=a; p2=b;for ( ; *p1!=0 ; p1+,p2+ ) *p2=*p1;*p2=0;printf (“string a is :%sn” , a );printf (“string b is :%sn” , b ); ,ab,p1,p2,I,a,m,a,t,a,e,c,h,e,r,0,两个字符串的复制,三、字符指针变量与字符数组的区别,1字符

22、指针变量中存放的是字符的地址,决不是将字符串放到字符指针变量中。,char str14=“I love China!”; char str14; str=“I love China!”;,2赋初值的方式:对字符数组可以在定义时整体赋初值,但不能在赋值语句中整体赋值。,3指针变量可以指向一个字符型数据,但如果 未对它赋以一个地址值,则它并未具体指向 哪一个字符数据。,运行结果:China!,char str60; scanf(“%s“, str) ;,char *a; scanf ( “%s“ , a ) ;,4指针变量的值是可以改变的,而数组名所指 的地址是固定的。void main( )ch

23、ar *a = “I love China!“;a=a+7;printf(“%s“, a);,a,-48-,void main( ) char *p , ch = ”I love china!” ;int i;p=ch;for( i=0 ; pi != 0 ; i+ ) printf( “%c”,pi ) ; ,5. 指针变量也可以用下标方式引用,p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13,I love China!,-49-,6用指针变量指向一个格式字符串。,char *format;format=“a=%d,b=%fn“;printf ( f

24、ormat , a , b ) ;,printf(“a=%d,b=%fn“,a,b);,-50-,char str1=“Hello!”; char str2=H,e,l,l,o,!;char str10,*cp; str=“Hello”; cp=“Hello!”;, ,void main() char s80 , *p=s;int len=0; scanf(“%s”, s);while(*p) p+; /* 找到串结束标记0 */len= p s ; /* 指向同一数组的两个指针进行减法运算,求出串长 */ ,例:求字符串的长度,求字符串长度的另一种方法 void main()char s80

25、; int i;printf(“请输入字符串:n”);gets(s);for(i=0; si!=0; i+);printf(“该字符串%s的长度为:%dn”,s, i); ,-52-,指针与二维数组 将二维数组视为一维数组 如:int x34; 则:数组x中的12个元素用一维数组元素可以表示为: 元素地址:x0+i*4+j , i=0,1,2; j=0,1,2,3或 j=0,1,2,3,-53-,练习: 用指针变量求四行五列二维实型数组的最大值、最小值和平均值,并指出最大值、最小值的位置。 分析: 主要变量说明:指针变量、二维数组、最大值、最小值、平均值,行、列 关键点:用指针变量记住二维数组

26、的首元素地址用*(指针变量+行下标*列数+列下标)的形式表示二维数组元素,-54-,#include void main()float x45,*p=x0,max,min,aver;int i,j,maxi,maxj,mini,minj;printf(“请按行输入20个实数,用空格分开n”);for(i=0;i4;i+)for(j=0;j5;j+)scanf(“%f”,p+i*5+j);,-55-,max=min=*p; aver=0.0; maxi=maxj=mini=minj=0; for(i=0;imax)max=*(p+i*5+j); maxi=i; maxj=j; if(*(p+i*

27、5+j)min)min=*(p+i*5+j); mini=i; minj=j; aver+=*(p+i*5+j); printf(“最大值: x%d%d=%7.2fn”,maxi,maxj,max); printf(“最小值: x%d%d=%7.2fn”,mini,minj,min); printf(“平均值: aver=%7.2fn”,aver/20); ,-56-,练习:求4个学生5门功课的平均分,并且按照平均分从高到低排序(冒泡法) 要求:将二维数组视为一维数组,用指针变量完成。 数组和指针变量定义:float s46,*p=s0; 数组元素sij则可表示为:*(p+i*6+j) 或pi

28、*6+j 其中:i=0,1,2,3j=0,1,2,3,4,5,-57-,输入4个学生5门功课的成绩 78 67 90 91 82 60 56 78 85 80 70 72 97 77 84 50 61 63 67 72 计算结果为:78.0 67.0 90.0 91.0 82.0 81.660.0 56.0 78.0 85.0 80.0 71.870.0 72.0 97.0 77.0 84.0 80.050.0 61.0 63.0 67.0 72.0 62.6 排序的结果为:78.0 67.0 90.0 91.0 82.0 81.670.0 72.0 97.0 77.0 84.0 80.060

29、.0 56.0 78.0 85.0 80.0 71.850.0 61.0 63.0 67.0 72.0 62.6,-58-,#include void main() float s46,*p=s0,t; int i,j,k; printf(“请输入4个学生5门功课的成绩n“); for(i=0;i4;i+)/求平均分 *(p+i*6+5)=0;/si5=0;for(j=0;j5;j+) scanf(“%f“,p+i*6+j);*(p+i*6+5)+= *(p+i*6+j);*(p+i*6+5)=*(p+i*6+5)/5; ,-59-,/输出计算结果 printf(“n计算结果为:n“) for

30、(i=0;i4;i+) for(j=0; j6; j+)printf(“%5.1f“,*(p+i*6+j);printf(“n“); ,-60-,/排序 for(i=0; i3; i+)/对最后一列的平均分排序for(j=0; j3-i; j+)if(*(p+j*6+5)*(p+(j+1)*6+5)for(k=0;k6;k+)/交换两行的6个数 t=*(p+j*6+k);*(p+j*6+k)=*(p+(j+1)*6+k);*(p+(j+1)*6+k)=t;,-61-,/输出排序结果 printf(“n排序结果为:n“) for(i=0;i4;i+) for(j=0; j6; j+)printf

31、(“%5.1f“,*(p+i*6+j);printf(“n“); ,一、指针数组的概念1指针数组就是数组的每个元素都是指针变量。2定义形式:类型标识 *数组名数组长度;int * p4; 这是有4个指针变量的指针数组。 3. 用途:使字符串操作更方便灵活。,7.5 指针数组,-63-,16,字符数组char name5 =,问题:图书馆有很多的书,书名不同,在计算机里如何存储这些书名?,“ Follow Me ”, “ BASIC ”,“ Great Wall ” , “ FOTRAN ”, “ Computer design ” ;,浪费空间,字符串指针,char *name1= “Foll

32、ow Me”; char *name2= ”BASIC”, char *name3= ”Great Wall” char *name4= “FORTRAN” char *name5= ”Computer design”,节省空间 使用不方便,指针数组,char *name5,= “Follow Me”,”BASIC”,”Great Wall” ,“FORTRAN”,”Computer design”;,节省空间 使用方便,-66-,用指针数组完成多个字符串的排序 程序如下(修改程序): #include “stdio.h “ #include “string.h “ void main( )

33、char s516 = “Follow Me”,”BASIC”,”Great Wall” ,“FORTRAN”,”Computer design”,strM;int i,j;,-67-,for(i=0;i0) strcpy(str,si);strcpy(si,sj);strcpy(sj,str); printf(“排序如下:n”)for(i=0;iN;i+)puts(si); ,运行结果: 排序为: BASIC Computer design FORTRAN Follow Me Great Wall,1.指向指针数据的指针变量,简称为指向指针的指针 2.定义格式:类型标识符 * * 标识符,int a=3 ;int *p1 ;int *p2 ;p1=,*p1? *p2?,7.6 多级指针,-69-,void main( ) int x5=1, 2, 3, 4, 5, *p=x, *pp;pp= A、1, 1 B、1, 2 C、2, 2 D、2, 3,x,&p,pp,p,x0,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报