指针、指针与函数省公开课一等奖全国示范课微课金奖课件_第1页
指针、指针与函数省公开课一等奖全国示范课微课金奖课件_第2页
指针、指针与函数省公开课一等奖全国示范课微课金奖课件_第3页
指针、指针与函数省公开课一等奖全国示范课微课金奖课件_第4页
指针、指针与函数省公开课一等奖全国示范课微课金奖课件_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十三章第1页第十三章指针本节目标:(1)了解指针与地址概念(2)掌握指针变量定义、初始化及指针运算(3)掌握指针作为函数参数应用(4)了解指向函数指针及返回值为指针函数本节重点难点:指针变量定义;指针变量作为函数参数第2页

指针地址和指针概念指针变量指针变量引用指针变量作为函数参数指向函数指针返回指针值函数第3页一、地址和指针概念为了说清楚什么是指针,必须搞清楚数据在内存中是怎样存放,又是怎样读取。内存区每一个字节有一个编号,这就是“地址”。假如在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。1、按变量地址存取变量值方式称为“直接访问”方式printf(″%d″,i);scanf(″%d″,&i);比如:第4页另一个存取变量值方式称为“间接访问”方式。即,将变量i地址存放在另一个变量中。第5页第6页一个变量地址称为该变量“指针”。比如,地址是变量i指针。假如有一个变量专门用来存放另一变量地址(即指针),则它称为“指针变量”。上述i_pointer就是一个指针变量。下面给出指针和指针变量定义指针变量值(即指针变量中存放值)是地址(即指针)。请区分“指针”和“指针变量”这两个概念。第7页1、定义一个指针变量定义指针变量普通形式为基类型*指针变量名;二、变量指针和指向变量指针变量下面都是正当定义:float*pointer_3;

char*pointer_4;第8页在定义指针变量时要注意两点:指针变量前面“*”,表示该变量类型为指针型变量。例:float*pointer_1;指针变量名是pointer_1,而不是*pointer_1。(2)在定义指针变量时必须指定基类型。需要尤其注意是,只有整型变量地址才能放到指向整型变量指针变量中。下面赋值是错误∶floata;int*pointer_1;pointer_1=&a;/*将float型变量地址放到指向整型变量指针变量中,错误*/第9页2、指针变量赋值①将一个变量地址赋给一个指针变量。如:p=&a;(将变量a地址赋给p)p=array;(将数组array首元素地址赋给p)p=&array[i];②用已赋值同类型指针变量赋值给pp1=p2;(p1和p2都是指针变量,且P2已经有值将p2值赋给p1)③指针变量能够有空值,即该指针变量不指向任何变量,能够这么表示:p=NULL;第10页①指针变量加(减)一个整数比如:p++、p--、p+i、p-i、p+=i、p-=i等。②两个指针变量能够相减假如两个指针变量都指向同一个数组中元素,则两个指针变量值之差是两个指针之间元素个数③两个指针能够比较大小3、指针运算第11页三、指针变量引用

请切记,指针变量中只能存放地址(指针),不要将一个整数(或任何其它非地址类型数据)赋给一个指针变量。

例1经过指针变量访问整型变量#include<stdio.h>voidmain(){inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;/*把变量a地址赋给pointer_1*/

第12页pointer_2=&b;/*把变量b地址赋给pointer_2*/printf(″%d,%d\n″,a,b);printf(″%d,%d\n″,*pointer_1,*pointer_2);}第13页

下面对“&”和“*”运算符再做些说明:假如已执行了语句pointer_1=&a;(1)&*

pointer_1含义是什么?“&”和“*”两个运算符优先级别相同,但按自右而左方向结合,所以先进行*

pointer_1运算,它就是变量a,再执行&运算。所以,&*

pointer_1与&a相同,即pointer_1;第14页(2)*&a含义是什么?先进行&a运算,得a地址,再进行*运算。即&a所指向变量,也就是变量a。*&a和*pointer_1作用是一样,它们都等价于变量a。即*&a与a等价。(3)(*pointer_1)++相当于a++。注意括号是必要,假如没有括号,就成为了*pointer_1++,从附录可知:++和*为同一优先级别,而结合方向为自右而左,所以它相当于*(pointer_1++)。因为++在pointer_1右侧,是“后加”,所以先对pointer_1原值进行*运算,得到a值,然后使pointer_1值改变,这么pointer_1不再指向a了。第15页例2输入a和b两个整数,按先大后小次序输出a和b。#include<stdio.h>voidmain(){int*p1,*p2,*p,a,b;scanf(”%d%d”,&a,&b);p1=&a;p2=&b;if(a<b){p=p1;p1=p2;p2=p;}printf(”a=%d,b=%d\n”,a,b);printf(”max=%d,min=%d\n”,*p1,*p2);}第16页运行情况以下:5,9↙

a=5,b=9max=9,min=5当输入a=5,b=9时,因为a<b,将p1和p2交换。交换前情况见图(a),交换后见图(b)。第17页第18页四、指针变量作为函数参数例3对输入两个整数按大小次序输出

#include<stdio.h>voidmain(){voidswap(int*p1,int*p2);inta,b;int*pointer_1,*pointer_2;scanf(”%d%d”,&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);printf(”a=%d,b=%d\n”,a,b);}第19页voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}第20页第21页例4输入a、b、c3个整数,按大小次序输出#include<stdio.h>voidmain(){voidexchange(int*q1,int*q2,int*q3);inta,b,c,*p1,*p2,*p3;scanf(”%d%d%d”,&a,&b,&c);p1=&a;p2=&b;p3=&c;exchange(p1,p2,p3);printf(”%d,%d,%d”,a,b,c);}第22页voidswap(int*pt1,int*pt2){inttemp;temp=*pt1;*pt1=*pt2;*pt2=temp;}voidexchange(int*q1,int*q2,int*q3){if(*q1<*q2)swap(q1,q2);if(*q1<*q3)swap(q1,q3);if(*q2<*q3)swap(q2,q3);}第23页五、指向函数指针1、用函数指针变量调用函数能够用指针变量指向整型变量、字符串、数组,也能够指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数指针。

例5求a和b中大者。先列出按普通方法程序。第24页#include<stdio.h>voidmain(){intmax(int,int);inta,b,c;scanf(″%d%d″,&a,&b);c=max(a,b);printf(″a=%d,b=%d,max=%d”,a,b,c);}intmax(intx,inty){intz;if(x<y)z=x;elsez=y;returnz;}第25页将main

函数改写为intmax(intx,inty){intz;if(x<y)z=x;elsez=y;returnz;}voidmain(){int(*p)(int,int);inta,b,c;p=max;scanf(”%d%d”,&a,&b);c=(*p)(a,b);printf(“a=%d,b=%d,max=%d”,a,b,c);}第26页2、用指向函数指针作函数参数函数参数能够是变量、指向变量指针变量、数组名、指向数组指针变量等。第27页调用形式:

sub(f1,f2);↓↓voidsub(int(*x1)(int),int(*x2)(int,int)){inta,b,i,j;a=(*x1)(i);/*调用f1函数*/b=(*x2)(i,j);/*调用f2函数*/…}第28页例6设一个函数process,在调用它时候,每次实现不一样功效。输入a和b两个数,第一次调用process时找出a和b中大者,第二次找出其中小者,第三次求a与b之和。

#include<stdio.h>voidmain(){intmax(int,int);/*函数申明*/intmin(int,int);/*函数申明*/intadd(int,int);/*函数申明*/voidprocess(int,int,int(*fun)();/*函数申明*/inta,b;printf(“inputaandb”);scanf(“%d,%d″,&a,&b);

第29页

process(a,b,max);process(a,b,min);

process(a,b,add);}第30页intmax(intx,inty)/*函数定义*/{intz;z=x>y?x:y;returnz;}intmin(intx,inty)/*函数定义*/

{intz;z=x>y?y:x;returnz;}第31页intadd(intx,inty)/*函数定义*/{intz;z=x+y;returnz;}voidprocess(intx,inty,int(*fun)(int,int)){intresult;result=(*fun)(x,y);printf(“%d\n”,result);}第32页六、返回指针值函数一个函数能够带回一个整型值、字符值、实型值等,也能够带回指针型数据,即地址。其概念与以前类似,只是带回值类型是指针类型而已。这种带回指针值函数,普通定义形式为类型名*函数名(参数表列);比如:int*a(intx,inty);第33页例7输入两个正整数,编写函数返回最大数地址,在调用函数中输出最大数。#include<stdio.h>voidmain(){inta,b,*p;scanf(“%d,%d”);p=fun(a,b);printf(“%d”,*p);}int*fun(intx,inty){if(x>=y)rerturn&x;return&y;}第34页七、指针数组和指向指针指针1、指针数组概念一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中每一个元素都相当于一个指针变量。一维指针数组定义形式为类型名数组名[数组长度];比如:int*p[4];第35页第36页例7将若干字符串按字母次序(由小到大)输出。#include<stdio.h>#include<string.h>voidmain(){voidsort(char*name[],intn);voidprintf(char*name[],intn);char*name[]={"Followme","BASIC","GreatWall″,"FORTRAN","Computerdesign"};intn=5;sort(name,n);print(name,n);}第37页voidsort(char*name[],intn){char*temp;inti,j,k;for(i=0;i<n-1;i++={k=i;for(j=i+1;j<n;j++=if(strcmp(name[k],name[j])>0)k=j;if(k!=i)temp=name[i];name[i]=name[k];name[k]=temp;}}}第38页voidprint(char*name[],intn){inti;for(i=0;i<n;i++)printf(″%s\n″,name[i]);}运行结果为:BASICComputerdesignFORTRANFollowmeGreatWall第39页七相关指针数据类型和指针运算小结1相关指针数据类型小结定义含义inti;定义整型变量iint*p;p为指向整型数据指针变量inta[n];定义整型数组a,它有n个元素int*p[n];定义指针数组p,它由n个指向整型数据指针元素组成int(*p)[n];p为指向含n个元素一维数组指针变量intf();f为带回整型函数值函数int*p();p为带回一个指针函数,该指针指向整型数据int(*p)();p为指向函数指针,该函数返回一个整型值int**p;p是一个指针变量,它指向一个指向整型数据指针变量第40页2指针运算小结(1)指针变量加(减)一个整数比如:p++、p--、p+i、p-i、p+=i、p-=i等。(2)指针变量赋值将一个变量地址赋给一个指针变量。如:p=&a;(将变量a地址赋给p)p=array;(将数组array首元素地址赋给p)p=&a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论