新编C语言程序设计教程PPT第9章指针课件_第1页
新编C语言程序设计教程PPT第9章指针课件_第2页
新编C语言程序设计教程PPT第9章指针课件_第3页
新编C语言程序设计教程PPT第9章指针课件_第4页
新编C语言程序设计教程PPT第9章指针课件_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

新编C语言程序设计教程清华大学出版社,周二强zeq软件学院计算机科学与工程系配套视频:博客:,第9章指针,9.6main函数和命令行参数9.7指向函数的指针变量9.8使用堆空间9.9典型例题,9.6main函数和命令行参数,在前面章节中为了简便main函数都没有返回值,实际上main函数标准的定义形式为:intmain(void)或intmain(intargc,char*argv)。当程序不需要使用命行参数时使用第一种形式,需要命令行参数时使用第二种形式。,命令行参数,命令行参数是指以命令行方式运行程序时所带的参数。设工程编译后得到了一个名为test.exe的可执行文件,则以命令行方式运行程序的方法为:先启动“DOS”窗口(开始运行输入cmd回车或开始程序附件命令提示符),再把当前目录转到工程所在目录的debug子目录(如E:csampletestdebug),然后输入test回车运行程序。,命令行参数,输入testabcd回车输入被空格分成了四个字符串,系统会把这些字符串传给main函数。如果main函数用第二种形式定义,则当程序运行时参数argc的值是命令行中字符串的个数,此时argc的值为4。命令行中的每个字符串都被存储到内存中,并且*argv(即argv0)指向第一个字符串,即文件名(text),*(argv+1)(即argv1)指向第二个字符串(a),以此类推。除文件名之外的字符串a、b、cd就是所谓的命令行参数。,命令行参数,intmain(intargc,char*argv),例9-23请分析下面的程序,库函数atoiintatoi(constchar*string)把string指向的由数字构成的字符串转换成相应的整数。,例9-23程序的运行,例9-23请分析下面的程序,注意:,1.操作系统会获得main函数的返回值,main函数的返回值为0时表示程序运行顺利,正常退出。2.在main函数的第二种定义形式中,参数类型固定,但参数名可变。如也可以用如下形式定义main函数。intmain(intn,char*pp),return,9.7指向函数的指针变量,存放函数体中相关指令的存储单元通常位于内存中称为代码段的部分。与数组名类似,函数名的值在C语言中同样被规定为与该函数相关的存储单元的首地址。调用执行函数实际上就是执行从函数名标识的首地址开始的相关存储单元中的指令。如果一个指针变量可以用函数名赋值,则称该指针变量为指向函数的指针变量。利用指向函数的指针变量也可以获得与函数相关的存储单元的地址,有了这个地址就能够执行相关指令,也这就是说利用指向函数的指针变量也可以调用执行函数,与使用函数名调用执行函数类似。,如何定义指向函数的指针变量呢?,指针变量的定义用*号,函数的定义用一对圆括号。函数的作用是完成从输入到输出的转换,编译系统检查函数调用正确与否的关键在于实参的个数、类型是否匹配、返回值类型是否匹配。综上所述,在定义指向函数的指针变量时需体现以上诸多要素。简单地说,定义时只需在函数的首部中把函数名部分改为(*指针变量名),并省略形参名即可。如求两个整数和的函数的说明为intadd(intm,intn);,则指向此函数的指针变量pf的定义为int(*pf)(int,int);。,注意:,1.语句int*pf(int,int);为函数pf的声明,该函数有两个整型的形参,返回值类型为指向整型变量的指针。2.指向函数的指针变量pf的值可以是一类函数的首地址,这类函数的特点是有两个整型形参,返回值类型也为整型。intadd2(intx,inty)pf=add2;,例9-24使用指向函数的指针变量调用函数,例9-25利用梯形法求f(x)的定积分的公式为,例9-25利用梯形法求f(x)的定积分,return,9.8使用堆空间,存放程序中数据的内存通常分为两个区:静态存储区和动态存储区。与全局变量相关的存储单元位于静态存储区,它们在程序运行之前分配,在程序运行期间始终为程序所有。与局部变量相关的存储单元位于动态存储区的栈中,它们在程序运行期间定义时分配,超出作用域后释放。动态存储区中还有一种称为堆的存储空间,在程序运行期间可以根据需要利用库函数在其上分配一块内存。,栈和堆,栈和堆是动态存储区中的两类存储空间。栈和堆中的存储单元都可以在程序运行期间分配或释放,但两者的管理方式不同。栈空间中存储单元由系统自动地分配和释放,而堆空间中的存储单元必须由程序员调用相关的库函数显式地分配和释放。如果程序中申请的位于堆空间中的存储单元在使用完毕后没有显式地释放,则它会一直为程序所拥有,直至程序运行结束。,申请堆空间,库函数malloc用于在堆空间中申请一块存储空间,它的形参是一个无符号整型,指出需分配内存块的以字节为单位的长度。如果内存块分配成功,则malloc函数返回该内存块的首地址,否则它将返回空指针NULL。显然,需要使用指针变量接受malloc函数返回的地址,但是malloc函数分配的内存块是什么类型呢?,malloc函数的返回值类型,malloc函数仅仅返回一个地址连续的内存块的首地址,该内存块在分配时没有指定类型。例如函数调用malloc(8)可能返回一个地址0 x004402b0,但实际上与该地址相关的内存块从0 x004402b0至0 x004402b7共8个字节。如果此内存块用来存储整数,则它可以存储两个整数,此时内存块的类型像是一个有2个数组元素的整型数组。如果这块内存用来存储双精度的浮点数,则它可以存储一个双精度的浮点数,此时该内存块的类型是双精度的浮点型。malloc函数的返回值类型是void*。,void*,在C语言中void*表示指向void型存储单元的指针。void型的存储单元是“无类型”的存储单元,仅是一个地址连续的内存块。无类型的内存块可以强制转换为其它类型的存储单元。如果想用malloc函数分配的内存块存储整数,则使用方式为:int*pi=(int*)malloc(8);*pi=2;*(pi+1)=3;。如果想用分配的内存块存储双精度的浮点数,则使用方式为:double*pf=(double*)malloc(8);*pf=2.3;,注意:,1.可以定义一个void型的指针变量,其它类型的指针变量无需类型转换就可以直接给它赋值,但是,void型的指针变量在使用时必须强制转换为其它类型的指针变量。2.malloc函数常见的使用方式为int*pi=(int*)malloc(2*sizeof(int);。库函数free用于释放使用malloc函数申请的堆空间,free函数的首部为voidfree(void*memblock)。使用free函数释放堆空间时只需把内存块的首地址传给free函数即可,无需考虑它已被强制转换为何种类型了。,例9-26分析下面的程序,注意:,1.在VC6.0中使用库函数malloc和free时需要包含头文件stdlib.h或头文件malloc.h。2.堆空间使用完毕必须及时释放以防内存泄露,释放完毕后需把相关指针变量赋值成空指针以防止出现野指针。,内存泄露,内存泄露指由于疏忽或错误未能释放已经不再使用的堆空间内存。当程序中申请的一块堆空间内存没有指针变量指向它时,这块内存肯定会因无法释放而泄露了。为所有程序共享的堆空间容量有限,当一个程序因内存泄露占用了大量的堆空间时,其它程序可能会因申请不到堆空间而不能正常运行。,例9-27分析下面的函数,该函数在调用执行时会发生内存泄露。指针变量str是局部变量,函数执行完毕其存储单元会自动释放,此时函数中在堆上申请的内存块将没有指针变量指向它,也就是说在程序中将无法释放此块内存,此内存块“泄露”了。每调用该函数一次,就泄露一块内存。,return,9.9典型例题,9-28已知inta32,i,j;,且有0i3,0j2。1.写出几个表示数组元素aij所标示存储单元的地址的表达式;分析,且有0i3,0j0)的报数,报到m的人出圈;接着从下一个人继续1至m的报数,报到m的人出圈;一直进行这样的报数,直到所有的人都出圈为止,试问他们出圈的次序。,9-30,第一步,判断当前要报数的人是否已经出圈,如果没有出圈则先报数(用+k表示),再判断报的数是否为m,如果是,则输出报数人的编号后让其出圈(此时变量k的值需清零,表示出圈人数的变量g的值需加1)。第二步,调整指针变量p指向下一个数组元素。重复上面两步,直到变量g的值为n时停止。,9-30,9-31库函数qsort,库函数qsort在头文件stdlib.h中声明为voidqsort(void*base,unsignedn,unsignedsize,int(*fcmp)(constvoid*,constvoid*)。库函数qsort采用快速排序算法对从base起始的n个元素base0到basen-1进行排序。参数base的类型为何定义为void*?排序时肯定要比较两元素的大小,数组元素的类型不知道怎么比较大小?参数unsignedsize为base中每个元素占用的存储单元的字节数。,库函数qsort分析,voidqsort(void*base,unsignedn,unsignedsize,int(*fcmp)(constvoid*,constvoid*)排序后各元素将依照比较函数fcmp的定义升序排列。函数指针fcmp指向的是一个用来比较两个参数“大小”的函数。若第一个参数“小于”第二个参数,它通常返回一个小于0的整数;否则若二者相等,则通常返回0;否则返回通常一个大于0的整数。,9-31调用qsort

温馨提示

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

最新文档

评论

0/150

提交评论