51058-00C语言程序设计课件-黄维通c_new_06_第1页
51058-00C语言程序设计课件-黄维通c_new_06_第2页
51058-00C语言程序设计课件-黄维通c_new_06_第3页
51058-00C语言程序设计课件-黄维通c_new_06_第4页
51058-00C语言程序设计课件-黄维通c_new_06_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1,第6章指针及其应用,2,本章主要内容,指针的基本概念及定义方式指针的运算指针与数组字符指针和字符串指针数组指针在函数参数传递中的应用指针型函数多级指针指向函数的指针动态指针,3,6.1指针的基本概念及定义方式,4,6.1.1指针的基本概念,就像同学与所住宿舍号码的关系,5,指针定义的一般形式为:类型标识符*指针名1,*指针名2,;,6.1.2指针的定义,数据具有不同的类型,定义指针时也要定义该指针所指向的数据类型,int*pn;char*pch;float*pf;,6,指针是一种变量,在定义的同时可以赋给它初始值,称为指针的初始化。形式如下:类型标识符*指针名=初始地址值;例如,intm,n8;charc;int*pm=int*i_pointer;i_pointer=,引用:i=3*i_pointer=3int*i_pointer;i_pointer=,10,“*”指针运算符,表示“指向”“pm=,在引入指针运算后,数据交换可通过指针所指向的存储地址进行操作,m和n的值改变了吗?,16,例:输入3个数,由大到小排序输出#includestdio.hvoidmain()inta,b,c,*pa,*pb,*pc;scanf(%d,%d,%d,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);,voidswap(int*a,int*b)intp;p=*a;*a=*b;*b=p;,17,6.3指针与数组,数组名是数组在内存中的首地址,且数组的元素在内存中占用连续的一片存储空间,因此,可用指针访问数组元素,18,floatx10,*px;/定义数组和指针px=x;或px=/指针指向数组,6.3.1指向一维数组的指针,访问数组元素方法:偏移量法,如:*(px+2)/px值不变指针移动法,如:px+/px值变化x+是不允许的,因为数组名是常量,*px就是x0,*(px+i)就是xi。xi,*(px+i),*(x+i)都是等效的,19,【例】使用指针对数组元素进行输入输出#includevoidmain()floatdata5,*pf=data;intk;for(k=0;k5;k+)scanf(%f,pf+k);for(k=0;k5;k+)printf(%f,*pf);pf+;for(k=0;kph)temp=*ph;*ph=*pt;*pt=temp;ph+;pt-;/两指针向中间移动for(k=0;k7;k+)printf(%d,*(data+k);,21,6.3.2指向多维数组的指针,(1)二维数组的指针假设有如下数组:inta34=1,3,5,7,9,11,13,15,17,19,21,23;,a00,a02,a12,a13,a03,a23,a20,a11,a21,a22,a10,a01,a0,a1,a2,(0X2000),(0X2010),(0X2020),a0+1,a2+2,a1+3,22,a0:第0行第0列元素的地址,即int*p,n;n=sizeof(a)/sizeof(int);for(p=a0;pa0+n;p+)printf(%d,*p);,24,例:求成绩的平均值(二维数组地址做函数参数)#includestdio.hvoidaverage(float*p,intn)float*p_end=p+n-1,sum=0,aver;for(;p=p_end;p+)sum=sum+(*p);aver=sum/n;printf(average=%5.2fn,aver);voidmain()staticfloatscore34=60,61,62,63,70,71,72,73,80,81,82,83;average(,25,在定义的同时进行初始化例如:char*p=astring;,6.4字符指针和字符串,末尾自动加0,标志结束,不计入总长度,利用赋值语句初始化char*s;s=string;,两种初始化的方法,26,【例】使用指针编写程序,比较两个字符串的大小(不使用字符串处理函数)步骤:定义两个指向字符串的指针通过移动指针进行逐字符比较如有字符串ABCdEF和ABCDEF,则认为ABCdEF比ABCDEF大原因:前3个字符一样,第4个字符d的ASCII值比D的ASCII值大,27,#includevoidmain()charstr150,str250;char*ps1=str1,*ps2=str2;scanf(%s,ps1);scanf(%s,ps2);while(*ps1!=0,28,【例】使用指针知识点,进行字符串复制操作#includevoidmain()chara=TsinghuaUniversity,b30;inti;for(i=0;*(a+i)!=0;i+)*(b+i)=*(a+i);/逐个字符复制*(b+i)=0;/加截止符printf(Stringais:%sn,a);for(i=0;bi!=0;i+)printf(%c,bi);/逐个字符输出,29,6.5指针数组,30,6.5.1指针数组的概念,数组元素是指针变量的集合,31,【例】输入星期号(从周日到周六编号分别为0到6),输出对应的英文名称。#includevoidmain()char*p7=Sun.,Mon.,Tue.,Wed.,Thur.,Fri.,Sat.;intcode;doprintf(pleaseinputthecoden);scanf(%d,6.5.2指针数组的应用,32,【例】使用指针数组实现23和32的整型矩阵相乘#includeintmain()staticinta23,b32,result22;int*p3,i,j,k;p0=a0;p1=b0;p2=result0;for(i=0;i2;i+)for(j=0;j3;j+)scanf(%d,p0+3*i+j);for(i=0;i3;i+)for(j=0;j2;j+)scanf(%d,p1+2*i+j);for(i=0;i2;i+)for(j=0;j2;j+)for(k=0;k3;k+)resultij+=(*(p0+3*i+k)*(*(p1+2*k+j);for(i=0;i0?+argv;/跳过第一个参数printf(%s,*argv);-argc;,echohelloworld!,36,6.6多级指针,37,6.6.1多级指针的概念及定义,1多级指针的概念,说明形式:存储类型数据类型*指针名,38,(b)二级指针定义之二char*p1;staticchar*p23=”Math.”,”Phy.”,”Chem.”;p1=p2;,(a)二级指针定义之一char*p1;char*p2=”Multipoint”;p1=char*pp=p;/pp指向p的首地址intdata;printf(输入06的整型数:);scanf(%d,6.6.2多级指针应用举例,40,例:用多级指针处理多个字符串#includestdio.hvoidmain()staticinta5=1,3,5;staticint*num5=,135TsinghuaPKU其他为何未输出?,41,【例】用指针数组处理多个字符串,按字母顺序由小到大排列#includestdio.h#includestring.hvoidmain()staticchar*name=Tsinghua,BeijingUniv,PeoplesUniv;intn=3;sort(name,n);print(name,n);,指针数组,namei和namej分别是第i和j个字符串的起始地址,若namei所指字符串大namej所指字符串,则函数为正值,相等为0,小于则为负值,voidsort(char*name,intn)char*t;inti,j;for(i=0;i0)t=namei;namei=namej;namej=t;,voidprint(char*name,intn)inti;for(i=0;if1(x)=1+x2f2(x)=1+x+x2+x3f3(x)=x/(1+x2),例:求定积分的值,S=hf(a)+f(b)/2+f(a+h)+f(a+2h)+f(a+(n-1)h),6.7.2指向函数的指针的应用,清华大学黄维通设计制作,45,/利用指向函数的指针变量的特性,求解定积分#include“stdio.h”floatintegral(float(*fun)(floatx),floata,floatb)floats,h,y;intn,i;s=(*fun)(a)+(*fun)(b)/2.0;n=100;h=(b-a)/n;for(i=1;in;i+)s=s+(*fun)(a+i*h);y=s*h;return(y);voidmain()/floatf1(),f2(),f3(),integral();floaty1,y2,y3;y1=integral(f1,0.0,1.0);y2=integral(f2,0.0,2.0);y3=integral(f3,0.0,3.5);printf(%6.2fn%6.2fn%6.2fn,y1,y2,y3);,floatf1(floatx)floatf;f=1+x*x;return(f);,floatf2(floatx)floatf;f=1+x+x*x+x*x*x;return(f);,floatf3(floatx)floatf;f=x/(1+x*x);return(f);,46,【例】用指向函数的指针实现加、减、乘、除运算#includestdio.hintcall(intx,inty,int(*func)(int,int)return(*func)(x,y);intadd(intx,inty)return(x+y);intsub(intx,inty)return(x-y);intmul(intx,inty)return(x*y);intdiv(intx,inty)if(y=0)return(0);elsereturn(x/y);,voidmain()int(*point)(int,int);intx=10,y=5;charc;scanf(%c,47,voidmain()int(*oper4)(int,int),x=10,y=5,i;staticcharc=+,-,*,/;oper0=add;oper1=sub;oper2=mul;oper3=div;for(i=0;i4;i+)printf(%d%c%d=%dn,x,ci,y,call(x,y,operi);,【例】用指向函数的指针实现加、减、乘、除运算#includestdio.hintcall(intx,inty,int(*func)(int,int)return(*func)(x,y);intadd(intx,inty)return(x+y);intsub(intx,inty)return(x-y);intmul(intx,inty)return(x*y);intdiv(intx,inty)if(y=0)return(0);elsereturn(x/y);,48,注意:,(1).(*p)()是专门用来存放函数入口地址,而不固定指向哪个具体的函数。(2).程序中指出哪一个函数的地址赋给它,就指向哪一个函数。(3).在一个程序中,一个指针变量可以先后指向不同的函数。(4).在给函数指针变量赋值时,只需给出函数名,而不必给出变量值。(5).对指向函数的指针变量,p+,p-,p+n等是无意义,但针对数组却是可以的。,49,6.8指针型函数,50,一般格式如下:存储类型数据类型标识符*函数名(形参表)形参说明;内部数据说明语句;执行语句;,6.8.1指针型函数的定义和引用,返回值是指针,51,有若干学生,每个学生有4门课,要求在输入学生序号以后,输出该学生的全部成绩#includestdio.hfloat*search(float*pointer,intn)float*pt;pt=pointer+4*n;/*指向score数组第n行*/return(pt);intmain()floatscore34=86,90,80,92,96,88,96,86,84,94,85,74;float*p;inti,m;/m是要查找学生的学号scanf(%d,6.8.2指针型函数的应用举例,清华大学黄维通设计制作,52,Type*malloc(size_tsize)为一个对象分配size字节大小的空间,通常使用方法如下Type*p;p=(Type*)malloc(n*sizeof(Type);,6.8.3动态分配存储空间,应用:动态开辟一段连续存储空间后续介绍的链表、二叉树等数据存储与管理,#include,清华大学黄维通设计制作,53,例如:#defineNULL(void*)0int*pn=NULL;double*pd=NULL:pn=(int*)malloc(10*sizeof(int);pd=(double*)malloc(10*sizeof(double);,voidfree(void*ptr)释放由指针ptr指向的空间,free(pn);pn=NULL;free(pd);pd=NULL;,清华大学黄维通设计制作,54,在程序中有时会用到“锯齿”数组,这种数据结构可以通过动态内存分配来实现。,动态内存分配的应用,字符串数组可以是典型的锯齿数组,一个字符串数组中每个元素是字符,而每个字符串的长度是不一样的,这个字符串数组就是一个“锯齿”数组。,数据个数不同的同类型数据的一维数组,为方便管理,也可构成“锯齿”数组,55,56,#include#includevoidmain(void)int*a,b,c,i;printf(请输入行数:);scanf(%d,/为第i行分配c+1个int空间,多出来的一个位置用于保存这一行的长度,【例】认识一个锯齿数组的分配,57,if(ai=NULL)fprintf(stderr,分配失败);ai0=c;/将第i行的长度保存到第i行的第一个元素中for(c=1;c=ai

温馨提示

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

评论

0/150

提交评论