37704-A0 C语言程序设计 苏小红9_第1页
37704-A0 C语言程序设计 苏小红9_第2页
37704-A0 C语言程序设计 苏小红9_第3页
37704-A0 C语言程序设计 苏小红9_第4页
37704-A0 C语言程序设计 苏小红9_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

第9章指针,哈尔滨工业大学计算机科学与技术学院苏小红sxh,本章学习内容,指针数据类型指针变量的定义和初始化取地址运算符,间接寻址运算符按值调用与按地址调用,指针变量作函数参数函数指针,voidSwap(intx,inty)inttemp;temp=x;x=y;y=temp;,intmain()inta,b;a=5;b=9;Swap(a,b);printf(a=%d,b=%d,a,b);return0;,程序1:简单变量作函数参数,例7.9未能解决的问题:两数互换,NotWork!Why?,指针为函数提供修改变量值的手段,9.1变量的内存地址,inta=0;,0 x0037b000,a,某存储区域,9.1变量的内存地址,0 x0037b000,某存储区域,0 x0037b001,0 x0037b002,0 x0037b003,a,9.1变量的内存地址,0 x0037b000,某存储区域,0 x0037b001,0 x0037b002,0 x0037b003,a,9.1变量的内存地址,【例9.1】使用取地址运算符,9.1变量的内存地址,0 x0037b000,某存储区域,0 x0037b001,0 x0037b002,0 x0037b003,间接寻址:通过存放变量地址的变量去访问变量,inti;scanf(%d,i);/*这样会如何?*/charc;scanf(%d,/*这样呢?*/,i的值被当做地址。如i=100,则输入的整数就会从地址100开始写入内存,输入以int的二进制形式写到c所在的内存空间c所占内存不足以放下一个int,其后的空间也被覆盖,9.2指针变量的定义和初始化,存放变量的地址需要一种特殊类型的变量指针(Pointer)类型指针变量具有指针类型的变量变量的指针变量的地址,9.2指针变量的定义和初始化,【例9.2】使用指针变量在屏幕上显示变量的地址值,如果指针指向一个非你控制的内存空间并对该空间进行访问,将可能造成危险,9.2指针变量的定义和初始化,【例9.2】使用指针变量在屏幕上显示变量的地址值,9.2指针变量的定义和初始化,【例9.2】使用指针变量在屏幕上显示变量的地址值,9.2指针变量的定义和初始化,【例9.2】使用指针变量在屏幕上显示变量的地址值,9.2指针变量的定义和初始化,【例9.2】使用指针变量在屏幕上显示变量的地址值,9.2指针变量的定义和初始化,【例9.2】使用指针变量在屏幕上显示变量的地址值,9.3间接寻址运算符,【例9.3】使用指针变量,通过间接寻址输出变量的值,9.3间接寻址运算符,【例9.3】使用指针变量,通过间接寻址输出变量的值,9,普通变量作函数参数按值调用(CallbyValue)Cannotmodifytheargument形参(Parameter)实参变量(Variable)指针作函数参数按地址调用(CallbyReference)Inordertomodifytheargument,use:指针形参(PointerParameter)temp=*x;*x=*y;*y=temp;,intmain()inta,b;a=5;b=9;Swap(,voidSwap(intx,inty)inttemp;temp=x;x=y;y=temp;,intmain()inta,b;a=5;b=9;Swap(a,b);printf(a=%d,b=%d,a,b);return0;,程序1,程序2,实参,形参,结果有何不同?,NotWork!Why?,Tracetheexecution,例9.6:编写函数实现两数的互换,intmain()inta,b;a=5;b=9;Swap(a,b);printf(a=%d,b=%d,a,b);return0;,voidSwap(intx,inty)inttemp;temp=x;x=y;y=temp;,5,5,a,b,实参,形参,9,9,x,y,5,5,temp,9,x和y是内部变量单向值传递,例9.6:编写函数实现两数的互换,主调函数,被调函数,intmain()inta,b;a=5;b=9;Swap(,voidSwap(int*x,int*y)inttemp;temp=*x;*x=*y;*y=temp;,temp=*x;*x=*y;*y=temp;,指针pTemp未初始化指针pTemp指向哪里未知对未知单元写操作是危险的,voidSwap(int*x,int*y)int*pTemp;*pTemp=*x;*x=*y;*y=*pTemp;,永远要清楚:每个指针指向了哪里指针指向的内容是什么,voidSwap(int*x,int*y)inttemp;temp=*x;*x=*y;*y=temp;,指针pTemp被赋了值但交换的是地址值不是指针指向单元的内容,voidSwap(int*x,int*y)int*pTemp;pTemp=x;x=y;y=pTemp;,9.5用指针变量作函数参数的程序实例,【例9.7】计算并输出最高分及相应学生的学号,【例9.7】计算并输出最高分及相应学生的学号,NotWork!Why?,9.5用指针变量作函数参数的程序实例,9.5用指针变量作函数参数的程序实例,【例9.7】计算并输出最高分及相应学生的学号,9.5用指针变量作函数参数的程序实例,【例9.7】计算并输出最高分及相应学生的学号,9.5用指针变量作函数参数的程序实例,【例9.7】计算并输出最高分及相应学生的学号,9.6函数指针及其应用,函数指针(FunctionPointers)就是指向函数的指针(PointertoaFunction)指向函数的指针变量存储的是函数在内存中的入口地址编译器将不带()的函数名解释为该函数的入口地址数据类型(*指针名)();例如:int(*p)();常见错误:忘记了前一个(),写成int*p();/*声明一个函数名为p、返回值是整型指针的函数*/忘掉了后一个(),写成int(*p);/*定义了一个整型指针*/定义时后一个括号内的参数类型与指向的函数参数类型不匹配,应用编写通用性更强的函数典型实例1计算函数的定积分典型实例2既能按照升序排序,又能按照降序排序,9.6函数指针及其应用,【例9.8】修改例8.8中的排序函数,使其既能实现对学生成绩的升序排序,又能实现对学生成绩的降序排序先不使用函数指针编程,9.6函数指针及其应用,9.6函数指针及其应用,9.6函数指针及其应用,【例9.9】修改例9.8中的程序实例,用函数指针编程实现一个通用的排序函数,对学生成绩既能实现升序排序,又能实现降序排序使用函数指针编程,9.6函数指针及其应用,9.6函数指针及其应用,9.6函数指针及其应用,voidSelectionSort(inta,intn,int(*compare)(inta,intb)if(*compare)(aj,ak)/*决定数据是否按升序排序,ab为真,则按降序排序*/intDescending(inta,intb)returnab;,9.6函数指针及其应用,指针变量与其他类型变量的对比,共性在内

温馨提示

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

评论

0/150

提交评论