第八章指针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
4、 (2)定义一个指向字符型数据的指针变量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;,注:指针变量的赋值只
5、能赋予地址,而不允许把一个数值赋给指针变量。,如: int *p; P=1000; (错误),例 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”,
6、*pa,*pa);,指针变量经过定义及初始化后,就可以使用指针变量来引用普通变量的值了。 形式: *指针变量,scanf(“%d,%d”,printf(“%d,%d”,a,b);,/ 从键盘输入数据给a,b赋值,/ 输出a,b的值,总结:要使用指针变量,首先要弄清指针变量的4个要素:,1、指针变量的类型:int型。,2、指针变量基类型:指针变量所指向的变量的类型。,3、指针变量的值:指针变量所指向的变量的地址。,4、指针变量本身所占据的存储单元:指针变量用来存放地址时所需占用的内存大小。,5、&与*的优先级相同,结合性:自右而左。,所以,若有定义 int x,*p= 则,&*p 表示x的地址,
7、等价于&x 等价于p,*&x 表示x的地址所指的单元,等价于*p 等价于x,例题2 (lt2.c) main() int a3=1,3,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
8、);,main() int a3,*p,i; printf(“n“); printf(“n“); ,for(p=a;pa+3;p+) scanf(“%d“,p);,/*给数组元素赋值*/,for(p=a;pa+3;p+) printf(“%6d“,*p);,/*输出数组元素*/,注:1)指针移动的最小单位是一个存储单元,而不一定是一个字节。对于基类型不同的指针变量,其增减1所“跨越”的字节数是不同的。,2)只有当指针指向一串连续的存储单元时,指针的移动才有意义。,8.2 指针与数组,8.2.1指针与一维数组,数组元素的指针:数组元素的地址。,数组的指针:数组的首地址。,一、数组元素的指针,数组
9、元素的指针就是数组元素的地址。 同前所述的普通变量的指针,例如:int a3,*p; p= /*指针变量p指向元素a1*/,二、指针的运算,C语言中指针指向数组元素时,可以对指针进行以下运算:,如有指针变量p 、q ,普通整型变量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的关系?,数值
10、相等,a +i 与 &ai的关系?,数值相等,再有定义:int *p=a;,则:p+i、 a +i 与 &ai 的关系?,数值相等,*(p+i)、 *(a +i) 与 ai 的关系?,数值相等,数组中任意元素的地址,数组中任意元素的引用,所以若有定义: int a10,*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
11、+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)+与*的优先级相同,结合性:自右而左。,2)*p+ 等价于 *(p+),表示先取出p的值,得到*p, 再使p的值增1。,* + p 等价于 *(+ p ),表示先使p的值增1,再得到*p,3)(*p)+ 表示先取得p所指单元的内容,然后使该单元内容加1。,4) + (*p)表示先使p所指单元的内容加1然后取得该
12、单元内容。,则下列表达式的值分别为多少?,(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)的值为:,50,4)指针s指向a2,不移动指针, 通过s引用a3的表达式为:,*(s+1),5)指针s指向a2,p指向a0,则s-p的值为:,2,指针做函数参数,形参是指针,实参是地址值或者指针变量。(见以下示例),当指针做函数参数时,形参和实参对应的是相同的内存空间,所以当在
13、函数中改变形参的值时,改变的就是原来实参的值。,请看以下例题(lt6_5.cpp):,因为数组名是数组的首地址,所以当数组名做函数参数时,传递是地址(指针)。因此当在函数中对形参数组进行操作时,实际上就是对实参数组的操作。,四、指针做函数参数,#include using namespace std; void swap(int *,int*); void main() int x=5,y=8; cout“x=“x“,y=“yendl; swap( ,实参是地址值,形参是指针,#include using namespace std; void main() int x=5,y=8; prin
14、tf(“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 =5,8; cout“a0=“a0“,a1=“a1endl; swap( a); cout“a0=“a0“,a1=“a1endl; void swap(int b ) int t; t=b0;b0=b1;b
15、1=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;,形参可以是数组名,形参可以是指针变量,2)若对swap函数的调用,实参是指针变量:swap(p),形参数组可以为以下形式:,所有int a2,*p=a;
16、,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)实参和形参都用指针变量。,练习:请分析以下函数的功能。 void upper( char *p ) do if(*p
17、=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 void main() int i,a10,*p=a; printf(“请输
18、入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、二
19、维数组地址的表示方法,在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这样一个变量。它只是一种地址
20、的计算方法,能得到第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个元素,每
21、个元素的类型是int。 此时,p的增值以一维数组的长度为单位。,注:括号不可省。 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)用指向数组的指针做函数参数,一维数组名称可以做函数参数,二维数组名称也可以做函数参数。在用指针变量做形参接受实参传递的地址时,注意实参和
22、形参类型的一致。,若有定义int a34; 有一个fun函数,请思考以下问题:,函数调用形式:,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+ ; retu
23、rn ; ,具有n个元素的二维数组,*p,每行4个元素的n行的二维数组,(*p)4,*p,*(*p+j),s/n,s/(n*4),练习:有一个班级,有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+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 指针 ppt 课件
链接地址:https://www.31doc.com/p-3162730.html