第八章指针ppt课件.ppt
《第八章指针ppt课件.ppt》由会员分享,可在线阅读,更多相关《第八章指针ppt课件.ppt(84页珍藏版)》请在三一办公上搜索。
1、第八章 指针,本章教学目标:,1、地址与指针的概念2、变量的指针和指向变量的指针变量3、数组的指针和指向数组的指针变量4、指针做函数参数,第8章 指针,变量和数据在内存中存放都要占用一定数量的内存空间(单位为字节)。计算机内存中的每个字节都有一个编号,该编号称为内存地址即指针。,变量的地址:每个变量的地址是指该变量所占存储单元 的第一个字节的地址。,指针:由于通过地址能找到所需的变量单元,可以说,地址“指向”该内存单元。所以,c语言中又将 地址形象化的称作“指针”。即某个变量的指针就是该变量的地址。,8.1指针和地址的概念,指针变量:C语言中有一种特殊的变量可以存放普通变量的地址,称为指针变量
2、。而要取得一个普通变量a的地址可使用&运算符(取地址运算符)。例如:若有变量a,则:&a即表示变量a的地址。反之,若要取得变量a的地址则可使用&运算符,即&a。即:专门存放指针(地址)的变量称为指针变量。,8.2 变量的指针和指向变量的指针变量,由上节可知,变量的指针就是变量的地址。存放变量地址的变量就是指针变量,用来指向另一个变量。,例如:int i=3;,3,变量p的空间,2000H,此处p即为指针变量,变量i的空间,在这里也可以说变量p指向变量i,在程序中用“*”表示“指向的对象”。,用*表示指向,即*p就表示变量i,所以,*p=3 与 i=3 等价,要使用指针变量,首先要弄清指针变量的
3、4个要素:,1、指针变量的类型:int型。,2、指针变量基类型:指针变量所指向的变量的类型。,3、指针变量的值:指针变量所指向的变量的地址。,4、指针变量本身所占据的存储单元:指针变量用来存放地址时所需占用的内存大小。,形式:,变量名,*,类型名称,注:1)*说明符,用来说明该变量为指针变量,2)类型名称:基类型,用来指定指针变量所指向的变量的类型。,3)指针变量的值是其所指向的变量的地址,而不能是普通的数据。,例如:若有定义 int*p,x;,若使p指向x,则可用:,p=,p=3;(错误),一、指针变量的定义,练习:(1)定义一个指向单精度型数据的指针变量q(2)定义一个指向字符型数据的指针
4、变量p,float*q;,char*p;,4)一个指针变量只能指向同一个类型的变量。,例如:若有定义 int x;float y;int*p;,p=,p=,warning:incompatible types-from float*to int*,二、指针变量的引用,1、给指针变量赋值,指针变量在使用之前必须先定义,而且必须赋值后才能使用,未经赋值的指针变量不能使用。,(1)定义的同时赋值如:int a;int*pa=&a;,(2)先定义再赋值如:int a,b;int*p;p=&a;p=&b;,注:指针变量的赋值只能赋予地址,而不允许把一个数值赋给指针变量。,如:int*p;P=1000;(
5、错误),例 int i;int*p=,变量必须已说明过且类型应一致,例 int*p=,例 int i;int*p=,用已初始化的指针变量作初值,2、引用指针变量的值,如有:int i;int*p=,则:printf(“%x”,p);,等价于:printf(“%x”,3、引用指针变量指向的变量,注:*指针运算符或者间接访问运算符,例题(lt1.c),pa=,pb=,/用pa指向变量a,/用pb指向变量b,scanf(“%d,%d”,pa,pb);,printf(“%d,%d”,*pa,*pa);,指针变量经过定义及初始化后,就可以使用指针变量来引用普通变量的值了。形式:*指针变量,scanf(“
6、%d,%d”,printf(“%d,%d”,a,b);,/从键盘输入数据给a,b赋值,/输出a,b的值,总结:要使用指针变量,首先要弄清指针变量的4个要素:,1、指针变量的类型:int型。,2、指针变量基类型:指针变量所指向的变量的类型。,3、指针变量的值:指针变量所指向的变量的地址。,4、指针变量本身所占据的存储单元:指针变量用来存放地址时所需占用的内存大小。,5、&与*的优先级相同,结合性:自右而左。,所以,若有定义 int x,*p=则,&*p 表示x的地址,等价于&x 等价于p,*&x 表示x的地址所指的单元,等价于*p 等价于x,例题2(lt2.c)main()int a3=1,3,
7、5,*p,i;p=a;printf(n);printf(n);,for(i=0;i3;i+)printf(%6d,);,*(p+i),/*将数组首地址赋值给指针变量p*/,for(i=0;i3;i+)printf(%6d,);,/*输出数组元素*/,或者*(a+i),printf(%6d,*p);p=p+1;,printf(%6d,*p);p+;,ai,for(p=a;pa+3;p+)printf(%6d,*p);,main()int a3,*p,i;printf(n);printf(n);,for(p=a;pa+3;p+)scanf(%d,p);,/*给数组元素赋值*/,for(p=a;pa
8、+3;p+)printf(%6d,*p);,/*输出数组元素*/,注:1)指针移动的最小单位是一个存储单元,而不一定是一个字节。对于基类型不同的指针变量,其增减1所“跨越”的字节数是不同的。,2)只有当指针指向一串连续的存储单元时,指针的移动才有意义。,8.2 指针与数组,8.2.1指针与一维数组,数组元素的指针:数组元素的地址。,数组的指针:数组的首地址。,一、数组元素的指针,数组元素的指针就是数组元素的地址。同前所述的普通变量的指针,例如:int a3,*p;p=/*指针变量p指向元素a1*/,二、指针的运算,C语言中指针指向数组元素时,可以对指针进行以下运算:,如有指针变量p、q,普通整
9、型变量n,则可进行如下形式的运算:,p+n,p-n,p+,p-,q-p、p-q,例如,若有定义:int a10;,则:a 与&a0的关系?,数值相等,再有定义:int*p=a;,则:p、a 与&a0的关系?,数值相等,则:*p、*a 与a0的关系?,相等,所以若有定义:int a10;,则:a 与&a0的关系?,数值相等,a+1 与&a1的关系?,数值相等,a+i 与&ai的关系?,数值相等,再有定义:int*p=a;,则:p+i、a+i 与&ai 的关系?,数值相等,*(p+i)、*(a+i)与 ai 的关系?,数值相等,数组中任意元素的地址,数组中任意元素的引用,所以若有定义:int a1
10、0,*p=a;请考虑以下问题:,a=a+1;是否正确,为什么?,p=p+1;是否正确,为什么?,三、用指针引用数组元素,若有定义:int a10,*p=a;则,1)下标为i的元素的地址:,2)下标为i的元素:,3)数组的指针变量可以用下标的形式:*(p+i)等价于pi,&ai,a+i,p+i,ai,*(a+i),*(p+i),例 int a=1,2,3,4,5,6,7,8,9,10,*p=a,i;数组元素地址的正确表示:(A)&(a+1)(B)a+(C)&p(D)&pi,分析以下几种形式正误p+或者p-a+或者a-a+1 或者a-1,(),(),(x),关于指针的运算:1)+与*的优先级相同,
11、结合性:自右而左。,2)*p+等价于*(p+),表示先取出p的值,得到*p,再使p的值增1。,*+p 等价于*(+p),表示先使p的值增1,再得到*p,3)(*p)+表示先取得p所指单元的内容,然后使该单元内容加1。,4)+(*p)表示先使p所指单元的内容加1然后取得该单元内容。,则下列表达式的值分别为多少?,(1)*p+,20,(2)*+p,30,(2)+*p,21,若指针p、s均为int型,且p已经指向a1,则:,1)通过指针p给s赋值,使s指向a4的语句为:,s=p+3;,2)用以移动s,使其指向a2的表达式为:,s-=2,3)已知k=2,指针s指向a2,则表达式*(s+k)的值为:,5
12、0,4)指针s指向a2,不移动指针,通过s引用a3的表达式为:,*(s+1),5)指针s指向a2,p指向a0,则s-p的值为:,2,指针做函数参数,形参是指针,实参是地址值或者指针变量。(见以下示例),当指针做函数参数时,形参和实参对应的是相同的内存空间,所以当在函数中改变形参的值时,改变的就是原来实参的值。,请看以下例题(lt6_5.cpp):,因为数组名是数组的首地址,所以当数组名做函数参数时,传递是地址(指针)。因此当在函数中对形参数组进行操作时,实际上就是对实参数组的操作。,四、指针做函数参数,#include using namespace std;void swap(int*,in
13、t*);void main()int x=5,y=8;coutx=x,y=yendl;swap(,实参是地址值,形参是指针,#include using namespace std;void main()int x=5,y=8;printf(x=%d,y=%dn,x,y);swap(,&x,&y,将实参的值传给形参,5,8,int*px=,swap(px,py);,void swap(int*,int*);,/函数声明,练习:请分析一下程序的运行结果(lt6_5.cpp)#include using namespace std;void swap(int b);void main()int a
14、=5,8;couta0=a0,a1=a1endl;swap(a);couta0=a0,a1=a1endl;void swap(int b)int t;t=b0;b0=b1;b1=t;,/实参是数组名,/形参是数组名,void swap(int b)int t;t=b0;b0=b1;b1=t;,void swap(int b)int t;t=b0;b0=b1;b1=t;,等价于,*b,1)若对swap函数的调用,实参是数组名:swap(a),形参数组可以为以下形式:,int t;t=*(b+0);*(b+0)=*(b+1);*(b+1)=*(b+0);,所有int a2,*p=a;,形参可以是数
15、组名,形参可以是指针变量,2)若对swap函数的调用,实参是指针变量:swap(p),形参数组可以为以下形式:,所有int a2,*p=a;,void swap(int*b)int t;t=*(b+0);*(b+0)=*(b+1);*(b+1)=*(b+0);,void swap(int b)int t;t=b0;b0=b1;b1=t;,等价于,形参可以是数组名,形参可以是指针变量,总结:归纳起来,如果有一个实参数组,要想在函数中改变此数组中的元素的值,实参于形参的对应关系有以下4种情况:,1)形参和实参都用数组名。,2)实参用数组名,形参用指针变量。,3)实参用指针变量,形参用数组名。,4)
16、实参和形参都用指针变量。,练习:请分析以下函数的功能。void upper(char*p)do if(*p=a,函数功能:将p字符串中的小写字母转换成对应的大写字母,练习:写出以下程序的运行结果:#include void upper(char*p)do if(*p=a,练习1):以下函数的功能是将一个数组中的元素倒序排放,请填空:void reverse(int*p,int n)int*q,t;for(;pq;p+,)t=*p;*p=*q;*q=t;,q=p+n-1,q-,练习2)以下程序是调用reverse函数,将实参数组中的元素倒序排放,请填空。(lt8_8.c),#include vo
17、id main()int i,a10,*p=a;printf(请输入10个数组元素:n);for(i=0;i10;i+,)scanf(%d,p);printf(n);reverse(,10);printf(变化后的数组元素为:n);for(;pa+10;p+)printf(%d,);printf(n);void reverse(int*p,int n)int*q,t;for(q=p+n-1;pq;p+,q-)t=*p;*p=*q;*q=t;,p+,p=a;,void reverse(int*,int);,*p,p=a,p,请大家仔细阅读教材208页例题8.8!,五、通过指针引用二维数组,1、二
18、维数组地址的表示方法,在c语言中,可以把一个二维数组先看成一个一维数组,数组中每个元素又是包含若个元素的一维数组。,若有定义:int a34;请思考下列问题:,a的值?,a0的值?,&a00的值?,a+1的值?,a0+1的值?,&a00+1的值?,数值是否相等?含义是否相同?,数值是否相等?,由以上分析可以得出:,ai:表示第i行的首地址,每加1相当于加1列,也称为列地址。,a:表示整个数组的首地址,每加1相当于加1行,也称为行地址。,a+i,ai,&ai0在数值上等同,但含义不同。,注:不要把&ai简单地理解为 ai元素的物理地址,因为并不存在ai这样一个变量。它只是一种地址的计算方法,能得
19、到第i行的首地址,&ai与ai值相同,但含义不同。,&a00或者 a0或者*a,1)指向二维数组元素的指针变量 这样的指针为指向某一具体类型的指针变量。,例如:main()int a34=1,2,3,4,5,6,7,8,9,10,11,12;int*p;p=/*使p指向首元素*/for(;pa0+12;p+)printf(“%d“,*p);,&a00,a0,a,*a,2、指向二维数组的指针变量,2)指向由m个元素组成的一维数组的指针变量,格式:类型名(*指针变量名)m;,例如:int(*p)4;,含义:p是指针变量,它指向一个数组,数组含有4个元素,每个元素的类型是int。此时,p的增值以一维
20、数组的长度为单位。,注:括号不可省。int(*p)4;与 int*p4;是不同的含义,例如:main()int a34=1,2,3,4,5,6,7,8,9,10,11,12;int i,j;int(*p)4;p=;/*使p指向数组的首地址*/for(i=0;i3;i+)for(j=0;j4;j+)printf(“%d”,);,&a00,a0,a,*a,*(*(p+i)+j),3)用指向数组的指针做函数参数,一维数组名称可以做函数参数,二维数组名称也可以做函数参数。在用指针变量做形参接受实参传递的地址时,注意实参和形参类型的一致。,若有定义int a34;有一个fun函数,请思考以下问题:,函数
21、调用形式:,fun(a0,),函数定义时的形式:,fun(,),int*p,fun(a,),fun(,),int(*p)4,例题:编写一个函数求一个二维数组中所有元素的平均值。,float aver(float,int n)float s;int i;for(i=0;in;i+,p+)s=s+;return;,float aver(float,int n)float s;int i;for(i=0;in;i+,p+)for(j=0;j4;j+)s=s+;return;,具有n个元素的二维数组,*p,每行4个元素的n行的二维数组,(*p)4,*p,*(*p+j),s/n,s/(n*4),练习:有
22、一个班级,有5个同学,每个同学4门成绩,编写程序完成(lt8_12.c)1)用一个函数实现求所有同学所有成绩的平均分。2)用一个函数实现输出某个同学的成绩信息。3)用一个函数输出有不及格课程的同学所有成绩。4)在main函数中调用以上三个函数,输出相应的信息验证以上函数的正确性。,作业:247页第14题,#include float aver(float(*p)4,int n)float s=0;int i,j;for(i=0;in;i+,p+)for(j=0;j4;j+)s=s+*(*p+j);return s/(n*4);void show(float(*p)4,int n)int i;f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 指针 ppt 课件
链接地址:https://www.31ppt.com/p-5308234.html