c语言 高级 教程 第五章.ppt_第1页
c语言 高级 教程 第五章.ppt_第2页
c语言 高级 教程 第五章.ppt_第3页
c语言 高级 教程 第五章.ppt_第4页
c语言 高级 教程 第五章.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、C和C计算机编程第5章指针和排列,厦门大学计算机科学二糖秋,前言:指针是什么?指针是存储其他变量地址的变量。为什么使用这么多的使用指针:有时是实现某种计算必不可少的渡边杏,第二,因为它的使用能使程序比一般方法更有效地运行。使用指针的优点和缺点:使用指针可以创建清晰、简单、高效的程序。但是,指针使用不当可能会指向意想不到的事情,导致严重的问题,或者程序混乱,难以理解。(David assell,Northern Exposure(美国电视电视剧),5.1指针、地址和内存由线性组织中的很多单元(通常是字节)组成,每个单元都可以通过序列号(地址)访问,较大的数据对象由多个单元组成,第一个单元的地址为

2、p=、p3360、c:p=、指针和地址(继续)、指针说明:*;示例:int * ip/*ip是指向整数的指针*/双*dp,atof(char *s) /*dp是指向双精度数的指针*/int x=1,y=2,z10Int * ipIp=、5.2指针和函数收购,调用的函数调用对调用函数变量没有影响,因为C遵循函数调用中的值传递调用机制。但是,通过用地址和指针的概念传递地址的方法,可以通过指针实现这一点。例如,如果要按如下方式调整swap函数、两个变量a和b的值,则可以使用swap(、调用方、swap、指针和函数收购(继续)以及指针变量来访问和更改函数调用函数内的数据对象:Getint是从输入读取数

3、字字符串并将其转换为整数的函数,但是有时读取的数字不能转换为整数,必须返回报告需要两个通道以避免冲突的事实的信息。 # include int getch(void);void ungetch(int);/* getint : get next interger from input into * pn */int getint(int * pn)int c,signwhile(isspace(c=getch();If(!ISDIGIT (C)、5.3指针和数组之间存在强烈的对应关系,可以作为下标访问,也可以作为指针访问。指针操作运行得更快,但初学者操作很难理解。下一个比较分析:pa=,无论p

4、a指向什么数据类型,pa 1始终是下一个元素,pa I始终是它后面的第I个元素。pa=ai可学习*(a I)for(n=0;*s!=0;S) n : return n在定义函数参数时等于char s和char *s。Func(char s).func(char *s).与相同。数组可以从任何元素(func(staticchar * allocp=alloc buf)传递到函数(func),包括Char * alloc(intn)if(alloc buf alloc socp)return allocp-n;else return 0;Void afree (char * p) if (p=al

5、locbuf,allocp,allocbuf 3360,allocbuf 3330类似,char)P message= now is the time这里没有文字复制,有些只有指针的分配,同时体不同于char *pmessage=now is the time 。Char amessage= now is the time后者是可以修改内容的数组。前者是字符串常数,修改内容的结果未定义。,n o w I s t h e t I m e 0,n o w I s t h e t h e t I m e 0,p message :a message :文字指针和函数(继续),以下是通过两个字符串函数

6、/* strcpp对字符串指针的更多了解ararWhile (si=ti)!=0)I;您还可以写如下:/* str cpy 3360 copy t to s;Array subscript版本*/voidstrcopy (char * s,char * t)inti 3360 while(* s=* t)!=0) s,t;while(* s=* t)!=0);while(* s=* t);文字指针和函数(继续),* str CMP 3360 return 0 if ST */int str CMP(char * s,char * t)int I 3360 for(I=0;Si=tiI)if(s

7、i=0)return 0;return si-ti;您还可以写如下:int strcmp (char * s,char * t)int I : for(I=0;* s=* t;s,t)if(* s=0)return 0;return * s-* t;5.6指针数组:指针的指针,指针本身是存储地址的变量,因此,您可以定义多个地址(例如char *ptrarray10)来存储指针数组。例如:对齐文本行:算法:读取所有行以按新顺序打印对齐、digits are need everywhere、joke cant be made too much、a new computer、指针数组:Int rea

8、d linesVoid qsort (char * lineptr,intleft,intright);Void writelines (char * lineprt,intnlines);/* sort inputlines */main()intnlines;If (nlines=readlines (line ptr,maxline)=0) qsort (line ptr,0,nlines-1);Writelines(lineprt,nlines);return 0;else printf(“error 3360 input too big to sortn”);Return 1:主节目

9、,指针阵列:指向指针的指针(继续),# define maxlen 1000 int getline(char *,int);char * alloc(int);/* read lines read input lines */int read lines(Char * line ptr,int maxlines)/*指向指针的指针*/int len,nlinesnlines=0;While (len=getline (line,maxlen)0)if(nlines=maxlines | |(p=alloc(len)=Strcpy (p,行);line ptrnlines=p;Retirn n

10、linesVoid writeline (char * line ptr,int nlines)int I;for(I=0);I nlinesI)printf(“% sn”,line ptri);子例程,while (nlines-0) printf (%sn ,* line PRT);指针数组:指针(继续),/* qsort : sort v left.v right into increasing order */Void qsort(char * v,intlet Void swap(char *v,int i,int j);if(left=right)return;Swap (v,左,

11、(左右)/2);/* move partition element to elem */last=left;for(I=left 1;I=rightI) if (strcmp (VI,vleft) 0) swap (v,last,I);Swap(v,left,last):/* restore partition elem */q sort(v,left,last-1);Qsort(v,last 1,right);/* swap 3360 interchange VI,and VJ */void swap (char * v,int I,int j)char * temp;Temp=VIVi=V

12、JVj=temp,子节目2,5.7多维数组,不像指针数组那么常用,但C提供多维数组。以下示例说明了多维数组的定义和应用:static int daytab213=/*C中的二维数组基本上是一维元素数组,*/0,31,28 30,31,/*初始化方法*/0,31,29,31,31,31,31,30,31,31,31,31.func(int daytab 13).甚至func (int (* day tab) 13).以下是使用静态指针数组并添加初始化的极好示例:/* month _ name 3360 Return the name of n _ th month */char * month

13、_ name(int n)static cc“February”Name0 : namen每个元素保存都只有一个指针。,5.9指针数组与多维数组比较,指针数组与多维数组的区别:char a1020Char * b10上一个A是实际的二维阵列,其长度为200个字元,可以下标存取,例如a34。b只是一维阵列,只有10个字符的指针单元格。下标操作(如B34)仅对将字符串放入单元格中的地址(如B3=about )有意义。比较Char * name=illegal month 、 Jan . 、 Feb . 、 Mar . 的两个定义Char aname 415=illegal month 、,illegal month 0 Jan 0 feb.0 mar.0,15,15,main (intargc,char * argv).argc3360参数的数量,即调用程序时命令行中的参数数量,节目名称本身(以空格分隔)argv:包含参数矢量的命令行:echo hello,world: argc=3 argv命令行参数打印程序如下所示:# include/* echo 3360命令行参数版本For(I=1;i0)printf(“% s % sn”,* argv,(argc0)?“:”);return 0;echo 0,hello,0,world 0,0,argv3360,pri

温馨提示

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

评论

0/150

提交评论