《二级C语言程序设计》第8章指针.ppt_第1页
《二级C语言程序设计》第8章指针.ppt_第2页
《二级C语言程序设计》第8章指针.ppt_第3页
《二级C语言程序设计》第8章指针.ppt_第4页
《二级C语言程序设计》第8章指针.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

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

文档简介

第8章指针,1.存储单元:构成存储单元的基本单位是字节,不同类型的存储单元由数量不等的连续字节组成,计算机给每个字节一个惟一的编号。2.指针:构成某一存储单元的连续字节的起始字节编号称为该存储单元的地址,也称为该存储单元对应变量的指针。即:变量的指针就是变量的地址,8.1.1指针的概念,如果有:inta=5;则内存情况如图8-1所示。a是存储单元(即变量)的名字,5是存放在存储单元中的内容,存储单元的地址是2000。,图8-1,8.1.2指针变量,指针变量:存放某一变量的地址的变量称为指针变量。指针变量的一般定义形式如下:类型标识符*标识符;例:int*p;允许指针变量在定义中初始化。例如:inta=5,*p=/*int*p,*q,*m,*n;p=,8.1.3指针变量的运算,2取指针变量指向的存储单元(或变量)运算*指针数据值如果有:inta;int*p;p=则:*p与a是相同的,表示同一个变量。,可以是常量、变量或表达式,8.1.3指针变量的运算,“则:指针变量p指向变量a;*p(即a)的值赋给b,b的值为3;将5赋给*p(即a),a的值为5。,8.1.3指针变量的运算,3比较运算当两个基类型相同的指针变量已被正确赋值后,可以对指针变量的值进行比较运算。如果有:inta6;int*p,*q;p=指针变量p、q的指向如图8-4所示。此时,对p、q进行比较运算,则有:pq、p=q、p=q的值为假;pq、p=q、p!=q的值为真。,图8-4,8.1.3指针变量的运算,4减法运算两个指针变量在一定条件下,可进行减法运算。设p,q指向同一数组,则p-q的绝对值表示p所指对象与q所指对象之间的元素个数。,如果有:chara10=Hello;char*p,*q;intn;p=指针变量p、q的指向如图8-5所示,则:n=5。,图8-5,8.1.3指针变量的运算,8.1.3指针变量的运算,5指针变量的运算应用举例例8.1输入a和b两个整数,按先大后小的顺序输出a和b。#includemain()int*p1,*p2,*p,a,b;scanf(%d,%d,8.2.1指针与一维数组,一、一维数组与指针定义一维数组与指针。例:inta5,*p;则a为首地址常量,其对象类型为int*;a值与则p0a2,p1a3,二、应用举例例8.2用不同的方法对有10个元素的整型数组进行输入输出。方法一:下标法。p+*p+,8.2.1指针与一维数组,p+;/*相当于p=p+1;*/特殊表达式:*p+;和*p-;先取用对象(*p),然后p自加减1+*p;与*+p;完全相同-*p;与*-p;完全相同,这四种形式都是p先自加减1,然后再取用对象,等价于*(p+)不等价于(*p)+,注意:,8.3.2指针与二维数组,一、二维数组与指针例intb35;可理解为:b是数组名.b是数组首地址.b数组包含三个元素:b0,b1,b2;而每个元素又是一个一维数组.则:b一般给p赋初值为数组首元素地址:p=则bij可用指针表示为:*(p+5*i+j)或p5*i+j,列数,p+5,例8.3用指向二维数组元素的指针变量处理二维数组的输入输出。程序一:#includemain()inta34;int*p,i,j;p=a0;for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,(p+i*4+j);for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(p+i*4+j);printf(n);,8.3.2指针与二维数组,程序二:#includemain()inta34;int*p,i,j;for(p=a0;pa0+12;p+)scanf(%d,p);for(p=a0;pa0+12;p+)if(p-a0)%4=0)printf(n);printf(%4d,*p);,8.3.2指针与二维数组,(2)指向一个由n个元素组成的一维数组的指针变量。又称行指针变量,或数组指针。其定义形式如下:类型说明符(*p)n;说明:1)类型说明符是指向一维数组元素的类型。2)该语句定义了一个指针变量p。3)指针变量p的基类型是由n个元素组成的一维数组类型。,行指针变量与二维数组,(二)二维数组与行指针例:intb35;int(*p)5;则:b是可以看作是一个二级指针常量;p是可以看作是一个二级指针变量;通常给p赋值为:p=b或p=b+i则p每增1是移动到下一行。则:bij的地址:*(b+i)+j=bi+j=pi+j=int(*p)4,i,j;p=a;for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,(*(p+i)+j);for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,*(*(p+i)+j);printf(n);,程序二:#includemain()inta34;int(*p)4,i,j;p=a;for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,(pi+j);for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,pij);printf(n);,行指针变量与二维数组,8.3.3指针数组,数组元素为指针类型的数组称为指针数组。指针数组的定义形式如下:类型说明符*标识符常量表达式;如果有:int*q3;则指针数组q可以用图8-14所示,图8-14,说明:(1)类型说明符是数组元素存储的地址的基类型。(2)“*”表示数组的元素值是地址,即元素类型为指针类型。(3)标识符是指针数组的名字。(4)常量表达式表示指针数组的大小。,使用指针数组来处理二维数组。,例如:如果有:inta34;int*b3,i,j;for(i=0;i3;i+)bi=ai;则有如图8-15所示的存储关系。,图8-15,此时,二维数组a中任一元素aij的地址可用指针数组b表示如下:bi+j*(b+i)+j相应地,二维数组a中任一元素aij可用指针数组b表示为:*(bi+j)bij*(*(b+i)+j)*(b+i)j,注意:(1)从以上用指针数组表示二维数组的形式看,其用法与用数组指针(指向一维数组的指针)相似,但要注意两者的概念是不同的,指针数组是由多个元素组成的,即有多个变量,指针数组名是一个地址常量,而数组指针是指向一维数组的指针,是一个变量。(2)指针数组和数组指针的定义形式是不同的:int*p3;定义p是一个指针数组;int(*p)3;定义p是一个数组指针。,指针数组与数组指针,用指针数组处理二维数组。,例8.5用指针数组处理二维数组。#includemain()inta34=1,3,5,7,9,11,2,4,6,8,10,12;int*b3,i,j;for(i=0;i3;i+)bi=ai;for(i=0;i3;i+)for(j=0;j4;j+)printf(%4d,bij);printf(n);,8.3.4指针与字符串,一用字符指针表示字符串字符指针的定义:char*字符指针变量名;例1:#includemain()char*str=“Iamhappy”;printf(“%s”,str);,str,二、字符数组与指针变量1.赋初值staticcharstr=”Ilovechina!”;(静态或外部类)char*a=”Ilovechina!”;(不必要求为静态或外部类)2.赋值char*a;a=”Ilovechina!”;(正确)charstr14;str=”Ilovechina!”(错误)3.输入字符串charstr10;scanf(“%s”,str);或gets(str);(正确)char*a;scanf(“%s”,a);(错误),8.3.4指针与字符串,用指针输入字符串正确的做法应是:charstr10;char*a;a=str;scanf(“%s”,a);gets(a);或a=(char*)malloc(10);scanf(“%s”,a);,8.3.4指针与字符串,输出字符串char*s=”Iamastudent”;puts(s);或printf(“%sn”,s);charstr=”Iamastudent!”;puts(str);或printf(“%sn”,str);,8.3.4指针与字符串,3用字符指针处理字符串应用举例例8.6将字符串s1从第m个字符开始剩余的所有字符送入到另一个字符串中。#includemain()intm;chars180,s280,*p,*q;printf(inputastring:n);gets(s1);printf(inputstartpoint:n);scanf(%d,8.3.4指针与字符串,例8.7利用字符指针数组输出多个字符串。#includemain()char*s4;inti;s0=China;s1=Shanghai;s2=Beijin;s3=Wuhan;for(i=0;i4;i+)printf(%sn,*(s+i);,8.3.4指针与字符串,8.4指针与函数,8.4.1指针作函数参数函数的参数不仅可以是整型、实型、字符型等数据类型,还可以是指针类型。指针作函数参数的作用是将一个变量的地址传送到另一个函数中。,例8.8用指针作为函数参数处理:输入两个整数,按先大后小的顺序输出。swap(int*p1,int*p2)intt;t=*p1;*p1=*p2;*p2=t;,#includemain()inta,b;scanf(%d%d,通过本次函数调用,从被调用函数中带回了两个处理结果.指针作形参,可以带回返回值,如果将swap(int*p1,int*p2)函数的定义改为以下两种形式,则函数调用形式以及结果会有什么不同?,swap(intp1,intp2)intt;t=p1;p1=p2;p2=t;,swap(int*p1,int*p2)int*t;t=p1;p1=p2;p2=t;,函数定义和函数调用的常用形式,形式一:main()inta10;fun(a,10);fun(intx,intn),形式二:main()inta10;fun(a,10);fun(int*x,intn),形式三:main()inta10,*p;p=a;fun(p,10);fun(intx,intn),形式四:main()inta10,*p;p=afun(p,10);fun(int*x,intn),函数定义和函数调用的常用形式,例8.9利用函数将数组a中的10个整数按相反顺序存放。voidinv(intx,intn)inti,j,k,t;k=n/2;for(i=0;ik;i+)j=n-1-i;t=xj;xj=xi;xi=t;,#includemain()inta10,i;for(i=0;i10;i+)scanf(%d,例8.10利用函数将数组a中的10个整数从大到小进行排序。voidsort(int*a,intn)inti,j,k,t;for(i=0;iak)k=j;t=ak;ak=ai;ai=t;,#includemain()inta10,*p,i;for(i=0;i10;i+)scanf(%d,8.4.2指针函数,一个函数可以带回整型值、实型值、字符型值,也可以带回指针类型的数据,即地址。返回值是指针类型的函数,称为指针函数。指针函数的定义:类型标识符*标识符(参数表);,8.4.2指针函数,例如:char*copy(char*s)char*s1;s1=s;return(s1);#includemain()chara80,*b;scanf(%s,a);b=copy(a);printf(%s,b);,8.4.3函数指针,1函数的地址函数在编译时被分配占用一段连续的存储单元,该连续的存储单元的首地址称为函数的地址。在C语言程序中,用函数的名字表示该函数的地址。例:如果有如下函数定义:intsum(intx,inty)intz;z=x+y;return(z);则函数名sum表示该函数的地址。,2指向函数的指针变量(函数指针)将函数的首地址存入一个指针变量中,该指针变量就被称为指向函数的指针变量,又称为函数指针。函数指针的定义:类型标识符(*标识符)();例如:int(*p)();说明:(1)“类型标识符”是函数指针指向的函数返回值的类型。(2)“标识符”是函数指针(指向函数的指针变量)的名字。(3)“(*标识符)”表示该标识符是一个指针变量。(4)标识符后的“()”表示该指针变量指向一个函数。,8.4.3函数指针,函数指针的赋值(将函数指针指向某一函数):函数指针名=函数名;例如:p=sum;利用函数指针调用其指向的函数:(*函数指针名)(),8.4.3函数指针,例如:#includemain()inta,b,c;intsum(int,int);int(*p)();p=sum;scanf(%d%d,8.5指向指针的指针,8.5指向指针的指针存放另一指针变量的地址的指针变量,称为指向指针的指针。指向指针的指针变量的定义:类型标识符*标识符;例如:如果有:int*p,*q,x;q=则有如图8-18所示的指针指向。,8.5指向指针的指针,如果将二维数组的每一行的地址存储在一个指针数组中,再将指针数组的首地址赋给一个指向指针的指针变量,则也可以使用指向指针的指针变量来处理二维数组。例如,如果有:inta34;int*b3,i,j;int*p;for(i=0;i3;i+)bi=ai;p=b;则有如图8-19所示的存储关系。,图8-19,则:p在使用时相当于b.,例8.11利用指向指针的指针处理二维数组。#includemain()inta34=1,3,5,7,9,11,2,4,6,8,10,12;int*b3,i,j;int*p;for(i=0;i3;i+)bi=ai;p=b;for(i=0;i3;i+)for(j=0;jechoChinaBeijinShanghaiChinaBeijinShanghai,argv0,argv1,argv2,argc=3,8.6命令行参数,带参数的main()的函数首部形式如下:main(intargc,char*argv)说明:(1)第一个形参argc是int类型,保存命令行中字符串的个数。(2)第二个形参argv是指向字符的指针数组,保存命令行中给出的字符串。调用带参数的main()函数的命令行形式如下:命令名参数1参数2参数n注意:命令名、各参数之间用空格隔开。字符串的个数(包括命令名字符串和所有参数字符串,即参数个数n+1)传递给main函数中的第一个参数argc,将命令行中的字符串(同样包括命令名字符串和所有参数字符串)传递给main函数中的第二个参数argv。,8.7本章考点,指针与指针变量的概念。指针变量的运算。一维数组的地址、指向一维数组的指针及其应用。二维数组的地址、指向二维数组的指针及其应用。指针数组的概念及其应用。用指针表示字符串。指针变量作为函数参数。指向指针的指针变量及其应用。命令行参数的基本概念。,8.7本章考点,8.8典型试题详解1对于基类型相同的两个指针变量,不能进行的运算是_。A)B)=C)+D)-正确答案:C(知识点:指针变量的运算)试题分析:基类型相同的两个指针变量可以进行比较、赋值及相减运算。2若有说明intn=2,*p=,则以下非法的赋值语句为_。A)p=qB)*p=*qC)n=*qD)p=n正确答案:D(知识点:指针与指针变量的概念、指针变量的运算)试题分析:赋值运算必须遵循类型相同或类型兼容原则。,8.7本章考点,3以下程序的输出结果是_。main()charp=abcdefgh,r;long*q;q=(long*)p;q+;r=(char*)q;printf(%sn,r);正确答案:efgh(知识点:指针变量的概念、用指针处理字符串),8.7本章考点,4设有以下程序:main()inta,b,k=4,m=6,*p1=执行该程序后,a的值为_,b的值为_。正确答案:07(知识点:指针与指针变量的概念、指针变量的运算)试题分析:a的值是两个指针值p1与p=程序运行后的输出结果是_。正确答案:6(知识点:二维数组元素的地址、指向二维数组元素的指针变量,7下列程序的输出结果是_。main()chara10=9,8,7,6,5,4,3,2,1,0,*p=a+5;printf(%dn,*-p);正确答案:5(知识点:一维数组的地址、指向一维数组的指针变量),8.7本章考点,8有以下程序:ma

温馨提示

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

评论

0/150

提交评论