C C程序设计 吴国凤 28054-00第6章 指针_第1页
C C程序设计 吴国凤 28054-00第6章 指针_第2页
C C程序设计 吴国凤 28054-00第6章 指针_第3页
C C程序设计 吴国凤 28054-00第6章 指针_第4页
C C程序设计 吴国凤 28054-00第6章 指针_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第六章指针Pointer,6.1指针的概念,指针是C语言的重要特征,是C语言访问内存数据和程序的灵活和有效的手段。,C语言的指针支持:函数的地址调用;动态分配内存;数组的地址引用。,内存、地址、指针(Memory,Address,Pointer),内存存放了计算机正在运行的程序和程序正在使用的数据。内存的基本单元是字节(Byte)。,为了访问内存单元,CPU给每个内存单元一个编号,该编号称为该内存单元的地址。,变量是程序中可以改变的量,当说明变量时,系统将为其在内存中开辟相应得内存单元。由此确定变量的地址及内存中的表示方式。,2000H,2001H,2002H,2003H,inta=0;,a的内存单元,a的地址,标识符命名的指针变量名。,指针标志。,指针指向对象的类型。,int*p,*q;/*p、q是指向整型变量的指针。*/,float*pfValue,*pf;/*pfValue和pf是指向浮点型的指针。*/,指针的引用,定义指针的目的是通过指针引用内存对象,指针的引用应按如下步骤进行:,说明指针,inta=0,*p;,指针指向对象,p=,通过指针引用对象,*p=*p+2;,指针操作的两种运算:,取地址运算,2000H,a,p,p=/*p指向a。*/,2000H,*p=2;,2,举例:,#includevoidmain(void)intx,*p;x=55;p=,2000H,x,p,2000H,55,65,关于指针的说明:,指针必须指向对象后,才能引用。,int*p;*p=2;/*Error!*/,p=则:p1=,a,2000H,b,2400H,p1,p2,2000H,2400H,p1+;/*含义指向a后的整型单元*/,2002H,2002H,p1-;/*指向a前的整型单元*/,p1+n;/*指向a后的n个整型单元*/,p1-n;/*指向a前的n个整型单元*/,p2-p1;/*a和b之间差的单元数*/,结果200H,pn相当于:p的实际内容nsizeof(*p);,六种关系运算,比较两个同类型变量之间的地址关系。,p1p2;,指针运算说明,#includevoidmain(void)inta,b,*p1,*p2;a=2;b=3;p1=,差别,a,指针指向数组,p=a;/*指向数组的首地址*/p=/*指向数组的首地址*/,通过指针引用数组元素,当指针指向数组的首地址时,则下标为i的元素地址为:p+i或a+i,引用数组元素可以有三种方法:,下标法:ai指针法:*(p+i)数组名法:*(a+i),注意:数组名是地址常量,不能改变!,a=p;/*Error!*/,举例:打印数组中的奇数。,#includevoidmain(void)inti,a10;for(i=0;i=A,将无符号的八进制字符串转换为十进制整数。,#includevoidmain(void)char*p,s6;inti,n=0;p=s;gets(p);for(;*p!=0;p+)n=n*8+*p-0;printf(“%dn”,n);,p指向s数组。,输入字符串。,s,p,s,5,5,6,0,n=0*8+5-05,n=5*8+5-045,n=45*8+6-0366,思考题:将4位十六进值字符串转化为十进制字符串。,指针与二维数组,如下说明数组inta34=1,2,3,4,5,6,7,8,9,10,11,12;,其二维结构如下:,行,列,为了便于索引,C语言将数组分为两级管理。,a0,a1,a2,将a理解为一维数组,数组有三个元素,它们分别为a0、a1,a2。各个元素又是一个有四个元素的一维数组。,从地址的角度看:a为a0第一行的首地址a+1为a1第二行的首地址a+2为a2第三行的首地址,a+1地址一次加一行。,i行j列数组元素的地址可以由ai+j得到。,数组名地址的两级管理,a,a0,a1,a2,a00a01a02,a10a11a12,a20a21a22,等价地址及其管理方式,数组名是数组的地址,而且是常量,*运算不改变其值!,以下三种地址等价:,a+i,*(a+i),ai,加法按行递增,数组名表示数组元素,aij,(*(a+i)j,*(*(a+i)+j),*(ai+j),指针与二维数组,a00,a,a01,a02,a0,a10,a11,a12,a1,a20,a21,a22,a2,a+1,a1+2,int*p,a34;p=a0;对于i行j列元素*(pi+j)*(*(p+i)+j)*(p+4*i+j)等价!,4.数组指针与指针数组,数组指针实际是指向一维数组的指针变量。,(1)数组指针的说明,说明格式:type(*指针名)列下标;,int(*p)4;,它代表指向一个包含个元素的一维数组。,一、数组指针,用指针方法输出各元素的值。#includevoidmain(void)inta34=1,2,3,4,5,47,7,8,9,10,11,12;intj,(*p)4;for(p=a;pa+3;p+)for(j=0;j4;j+)printf(%5d,*(*p+j);printf(n);,(2)数组指针的应用,#includevoidmain(void)inta34=1,2,3,4,5,47,7,8,9,10,11,12;inti,j,(*p)4;p=a;for(i=0;i3;i+)for(j=0;j4;j+)printf(%5d,*(*(p+i)+j);printf(n);,二、指针数组,指针是存放其它数据对象地址的变量。因此,指针可以构成数组。每个数组元素为一个指针变量,且在内存中连续存放。,指针数组的说明,说明格式:type*数组名constexp;,int*p4;,含义是在内存中开辟空间,并指明元素所指向的对象的类型。,数组名p为数组的地址。,使用前必须让各元素指向对象。,inti,a34,*p3;for(i=0;i3;i+)pi=ai;*(p2+1)=2;/*通过指针数组引用数组元素a21*/,指针数组的应用举例,通过指针数组按数学方式输出数组的值。,#includevoidmain()inti,j;inta34=1,2,3,4,5,6,7,8,9,10,11,12;int*p3;p0=a0;p1=a1;p2=a2;for(i=0;i3;i+)for(j=0;j4;j+)printf(“%5d”,*(pi+j);printf(“n”);,p0,数组a的二维结构,p1,p2,a0,a1,a2,每输出一行,打印回车。,6.4指向指针的指针,如果指针变量的内容存放其它指针的地址,称该指针为指向指针的指针。,指向指针的指针的说明:,形式:type*p;,int*p;,p是一个指向整形指针的指针。,#includevoidmain(void)intx,*p,*q;x=10;p=,p为指向整型的指针。,q为指向整型指针的指针。,x,p,q,2000H,3000H,10,2000H,3000H,6.4指针与函数,floataver(float*pa)inti;floats=0;for(i=0;i5;i+)s=s+*pa+;s=s/5;returns;,例1:输入一个学生5门课的成绩到数组a,求平均成绩。,#includevoidmain()floatsco5,av,*sp;inti;sp=sco;printf(“ninput5scores:n”);for(i=0;i=y?x:y);,2400H,指向函数指针的定义:,type(*p)();,函数的类型。,指针,函数,使用过程:,定义函数和指向函数的指针;指针指向函数;p=funname;通过指针引用函数。格式:(*p)(实参表);,6.4.2指向函数的指针,max(实参表),()不能省int(*p)()与int*p()不同,专门存放函数入口地址可指向返回值类型相同的不同函数,函数返回值的数据类型,例1:利用指针形式实现对函数的调用。,#includeintlmax(int,int);voidmain(void)inta,b,c;int(*funp)();funp=lmax;scanf(“%d,%d”,说明指向函数的指针。,指针指向函数。,funp,lmax,通过指针引用函数。,lmax,例2:通过参数传递,求a、b之和、之差。,#includeintsum(int,int);intdif(int,int);intfuna(int,int,int(*)(int,int);voidmain(void)inta,b,c;scanf(“%d,%d”,intsum(intx,inty)return(x+y);intdif(intx,inty)return(x-y);,6.4.3指针型函数,概念:函数可以返回一个值,也可以返回一个地址(指针),如果函数返回指针,称为返回指针的函数。,定义:type*函数名(形参表)/*函数体*/,int*max(int*a,int*b),注意:int(*p)()和int*p()的区别:int(*p)()是定义一个指针(p是一个指向函数入口的指针变量);int*p()则是定义一个函数(p是一个返回值为指针的函数),它还有函数体部分。,例1:输出程序运行结果。,#include#includechar*ss(char*);voidmain(void)char*p,*str=“abcdefgh”;p=ss(str);printf(“%sn”,p);char*ss(char*s)returns+strlen(s)/2;,6.5带参数的主函数,如DOS命令:COPYA:S.DOCC:,命令名。,命令参数。,主函数main()也可以带参数,由于main()不能被其他函数调用,故无法在程序内部取得实

温馨提示

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

最新文档

评论

0/150

提交评论