c语言程序设计16第十六讲(第七章上+编码规范).ppt_第1页
c语言程序设计16第十六讲(第七章上+编码规范).ppt_第2页
c语言程序设计16第十六讲(第七章上+编码规范).ppt_第3页
c语言程序设计16第十六讲(第七章上+编码规范).ppt_第4页
c语言程序设计16第十六讲(第七章上+编码规范).ppt_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

1 下周一 11月30 上机 记考勤地点 九教北402 我们上机对面机机房 2 高级语言程序设计 主讲教师 贾彩燕计算机与信息技术学院计算机科学与技术系cyjia 3 课程内容 第一章程序设计和C语言第二章数据对象与计算第三章变量 函数和控制结构第四章基本程序设计技术第五章C程序结构 函数 第六章数组第七章指针第八章文件和输入输出第九章结构和其它数据机制第十章程序开发技术第十一章标准库 4 数组的概念 定义和使用数组程序实例数组作为函数参数字符数组和字符串两维和多维数组编程实例 第六章 数组 一维数值型数组的重要应用 5 课程内容 第一章程序设计和C语言第二章数据对象与计算第三章变量 函数和控制结构第四章基本程序设计技术第五章C程序结构 函数 第六章数组第七章指针第八章文件和输入输出第九章结构和其它数据机制第十章程序开发技术第十一章标准库 6 第七章指针 7 C程序设计中使用指针可以 使程序简洁 紧凑 高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值成也萧何败也萧何 8 地址与指针指针变量的定义和使用指针与数组指针数组多维数组作为参数的通用函数动态存储管理定义类型指向函数的指针 主要内容 9 7 1地址与指针 变量与地址 程序中 inti doublek 内存中每个字节有一个编号 地址 类似于房间的房号 i k 编译或函数调用时为其分配内存单元 变量是对程序中数据存储空间的抽象 10 变量存在时有地址 地址用二进制编码 因此可能成为程序处理的数据 问题 地址作为数据有什么用 若程序可处理对象地址 就可通过地址处理相关对象 指针是一种访问对象的手段 利用这种机制能更灵活方便地实施对各种对象的操作 以地址为值的变量称为指针变量 指针 pointer 对象 如变量 地址也被作为数据 地址值 指针值 11 指针 一个变量的地址指针变量 专门存放变量地址的变量叫指针变量 2000 指针 指针变量 变量的内容 变量的地址 指针与指针变量 12 地址与指针指针变量的定义和使用指针与数组指针数组多维数组作为参数的通用函数动态存储管理定义类型指向函数的指针 主要内容 13 7 2指针变量的定义和使用 指针有类型 只能保存特定类型的变量的地址 定义指针需指明指向类型 定义指向int的指针变量 int p q 指针变量可以与其他变量一起定义 double p n a 10 q p1 m 指针是变量 可赋值取值 有定义域与存在期 14 取地址运算符 和间接访问操作 都是一元运算符 取地址运算 指针操作 指针赋值 将对象的地址存入指针变量 间接访问 通过指针访问被指对象 15 间接运算 写在指针变量前用来取指针所指变量的值 间接运算得到被指针所指的变量 这种表达式可以像普通变量一样使用 intn 7 p q a 10 p 访问n三次 p 使变量n的值加1 变成18 p 使变量n的值再加1 变成19 p q n 变量n被赋以新值57 q 指针q指向了数组a的元素a 0 16 直接访问 按变量地址存取变量值间接访问 通过存放变量地址的变量去访问变量 例i 3 直接访问 3 例i pointer 间接访问 20 直接访问与间接访问 17 例k i 直接访问k i pointer 间接访问 10 例子图解 18 2000 2004 2008 地址 i p i 假定一个整型数据占四个存储单元 inti int p p 2004 指针变量算术运算的过程 p新 p原值 n sizeof 类型 不允许直接对指针变量赋常量值 如 int point point 2000 19 intmain int p1 p2 p a b scanf d d a 7 p2 p1 b 7 a 8 p2 p1 a b b a p 例分析下面程序的功能 20 指针作为函数参数 例 定义函数swap 希望用它交换两个变量的值 问题 因为要改变两个变量 无法通过返回值解决 指针作为函数参数有特殊意义 利用这种参数可写出能修改调用时环境的函数 一般变量 含数组元素 作为函数参数时数组名作为函数参数指针作为函数参数 21 voidswap0 intx inty intt x x y y t intf inta 5 b 10 swap0 a b 是否能完成a b交换 否 22 用指针可以解决问题 把m的地址 也是值 通过指针参数p传给g 函数内对p间接访问就能操作m 包括对m赋值 改变m 23 例 通过函数调用把变量值设置为3voidset3 int np np 3 intmain intn m printf d d n n m set3 请回忆scanf的情况 scanf d 本质是通过间接访问的方式对变量n赋值 24 通过参数改变调用环境的方案 函数定义中用指针参数 voidset3 int np 函数内用间接操作实际变量 np 3 调用时以被操作变量的地址作为实参 set3 函数swap可定义为 voidswap int p int q intt p p q q t 交换变量m和n的值 调用形式是 swap 25 swap参数类型是 int 实参必须是合法的整型变量的地址 设有变量定义 inta 10 k 调用swap的实例 swap 26 特点 共享内存 双向 传递 voidswap intx inty inttemp temp x x y y temp intmain inta b scanf d d 例将数从大到小输出 1 实参 形参都是整型 5 9 5 5 9 COPY 指针变量作为函数参数 地址传递 运行结果 5 9 值传递 27 voidswap intx inty intt t x x y y t intmain inta b int pointer 1 pointer 2 scanf d d 运行结果 5 9 值传递 5 9 2000 2002 COPY 5 5 9 例将数从大到小输出 2 实参与形参都是整型 28 voidswap int p1 int p2 int p p p1 p1 p2 p2 p intmain inta b int pointer 1 pointer 2 scanf d d 运行结果 9 9 编译警告 结果不对 intx int p 5 9 2000 2002 9 9 COPY 假设2000 指针变量在使用前必须赋值 例将数从大到小输出 3 实参 形参都是指针 内容交换 29 运行结果 5 9 voidswap int p1 int p2 int p p p1 p1 p2 p2 p intmain inta b int pointer 1 pointer 2 scanf d d 5 9 2000 2002 COPY 2000 地址传递 2000 2002 例将数从大到小输出 4 实参 形参都是指针 地址交换 30 voidswap int p1 int p2 intp p p1 p1 p2 p2 p intmain inta b int pointer 1 pointer 2 scanf d d 5 9 2000 2002 5 9 COPY 5 例将数从大到小输出 5 实参 形参都是指针 内容交换 地址传递 运行结果 9 5 31 例1 不用函数返回值 用指针返回求n 的结果 includevoidfactor long int voidfactor long f intn inti for i 1 i n i f f i intmain longfac 1 intn 5 factor 32 intmain inta b c p1 p2 p3 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 intt t a a b b t 例2 用指针做函数参数实现 输入a b c三个整数 按大小顺序输出 33 intgetnumber intm inti n for i 0 i m printf Wrong Anumberin0 d n m 1 while getchar n elsereturnn return 1 例3 猜数程序中输入整数值并检查值范围的函数 引进指针参数 使之能更好处理输入错误 34 新函数定义 将getrange 和getnumber合为一个函数intgetnumber charprompt intimin intimax intrepeat int np inti np 0 for i 0 repeatimax printf Correctrange d d n imin imax while getchar n elsereturn1 return0 35 前面的调用现在可以重写为 getnumber Choosearange 0 n Inputn 2 32767 5 完整的调用形式 if getnumber Yourguess 0 m 1 5 guess 0 处理输入出错的程序片段 这类函数的形参为指针 实参必须是合法变量地址 36 函数定义形式 类型标识符 函数名 参数表 函数体 函数的返回值是指针 例 int search int x intn int p p x n return p 函数的返回值为指向整型的指针 37 2 3 2002 2000 例写一个函数 求两个int型变量中居于较大值的变量的地址 1 38 2002 例写一个函数 求两个int型变量中居于较大值的变量的地址 2 39 2 3 3 2 例写一个函数 求两个int型变量中居于较大值的变量的地址 3 40 不能返回形参或局部变量的地址作函数返回值 200A 例写一个函数 求两个int型变量中居于较大值的变量的地址 4 41 空指针值一个特殊指针值 表示指针变量闲置 未指向任何变量 唯一对任何指针类型都合法的值空指针值用0表示 标准库专门定义了符号常量NULLp NULL 和p 0 相同前一写法易看到是指针 用时必须包含任一个标准头文件 指针初始化指针变量定义时可用合法指针值初始化 intn p 若没有初始化 外部指针和局部静态指针自动初始化为空 局部自动指针不自动初始化 与指针有关的一些问题讨论 42 使用指针的最常见错误是非法间接访问 在指针未指向合法变量的情况下做间接访问 如 intf int p n 3 p 2 p是悬空指针 p没有初始化 没有指向合法变量 悬空指针 指值不是当时合法的变量地址的指针变量 也常被称为 野指针 间接访问悬空指针是严重错误 后果可能很严重 指针使用中的常见错误 43 类型 void 可以指向任何类型变量 声明 intn p doublex q void gp1 gp2 任何指针值可以赋给通用指针 不必转换 例 gp1 gp2指向x 通用指针 44 可以把通用指针的值赋给普通指针若通用指针gp1指向n n的类型是普通指针p的指向类型 将gp1赋给p 要写强制转换 通过p保证正确访问n 被赋指针与通用指针所指变量类型不符 赋值后间接访问的效果没有保证 intn p doublex q void gp1 gp2 gp1 不合法 q是 double 指针类型转换并不改变指针值 只是一种观点转换 通用指针不能做间接运算通用指针可以指向任何变量 通过通用指针间接访问的意义无法确定 通用指针没提供被指对象的类型信息 所以不能通过它们直接使用被指对象通用指针唯一用途就是提供指针值 45 作业 1 上机实现本课件中26 30页中的程序 总结各种情况下的结果 2 指针法实现 输入三个整数按由小到大的顺序排序3 用指针法实现猜数游戏 将getrange和getnumber合为一个带指针参数的函数这部分很重要 是基础 不懂的部分回去好好消化 46 高级语言程序设计之 C语言编码规范 Codingstandards 47 1 文件级模块说明规范 Filemodulespecification 48 文件级模块说明规范的含义 模块定义 指以独立的文件形式存在的模块 主要包括两类C或C 的扩展名为 c或 cpp的源代码文件模块 例如abc cpp exam c扩展名为 h的头文件模块 如abc h exam h对于任何一个用户新建的模块 必须按规范要求给出模块的相关描述信息 49 文件级模块说明的构成 文件级模块说明至少应由以下部分构成1 模块的作者信息2 模块的版权声明3 模块的名称4 模块的摘要描述5 模块的其它说明6 模块的历史信息 50 文件级模块说明的编写 1 每个用户的文件级代码模块必须编写一个说明2 模块说明要求以注释的形式出现在模块的首部3 为了减少每次的工作 每个人应先编写好不变部分 每新建一个模块将不变部分复制到文件首部 再行更改可变部分 51 中文版文件级模块说明规范 作者信息 姓名 学号 班级 学院 Email 电话 版权声明 模块名称 本模块详细名称 不是文件名摘要 摘要地描述本模块的功能其它说明 可有可无 有关本模块的附加说明 这些说明可以在以后帮助代码的阅读者理解这个模块里的内容 如 算法的描述 特殊情况 参考资料等模块历史 谁于某年某月某日创建本模块 创建人email谁于某年某月某日修改本模块 修改人email修改原因 可有可无 根据需要添加 52 例子 作者信息 姓名 张三学号 06123456班级 计科0601班学院 计算机Email zhangsan 电话 51689999版权声明 版权由张三所有 除老师外 未经允许不得拷贝本人作业模块名称 第一个模块摘要 本模块是我的第一个C语言作业 实现了一些简单的功能其它说明 无模块历史 张三于2006年9月20日创建本模块 email zhangsan 张三于2006年9月25日修改本模块 email 同上修改原因 增加了一个输出正方形的函数 注意 红色部分为必填部分 缺填红色部分可能导致作业无法得到批阅 注释开始 注释结束 53 作者信息 姓名 张三学号 06123456班级 计科0601班学院 计算机Email zhangsan 电话 51689999版权声明 版权由张三所有 除老师外 未经允许不得拷贝本人作业模块名称 第一个模块摘要 本模块是我的第一个C语言作业 实现了一些简单的功能其它说明 无模块历史 张三于2006年9月20日创建本模块 email zhangsan 张三于2006年9月25日修改本模块 email 同上修改原因 增加了一个输出正方形的函数 include stdio h include string h main函数说明 main 模块说明示例 example cpp 54 EnglishVersion AuthorInfo Name AuthorID Class School Email Tel Copyright c 2005NJTUModuleName Anunabbreviatednameforthemodule notthefilename Abstract DescriptionofwhatthismoduledoesNotes Optional Additionalnotesaboutthismodule thingsthatmayhelpthereaderofthiscodelateron Examplesare algorithmdescription specialcaseconditions references etc History Createdonmm dd yyyybyemail nameModifiedonmm dd yyyybyemail name Optional historydescription 55 2 函数说明规范 FunctionSpecification 56 关于函数说明 对于作业中程序的任何一个函数 包括main函数 都需要写出函数的说明一个良好的编程习惯 写任何一个函数以前 第一步工作就是先把函数说明写出来 而不是直接先写代码 57 函数说明规范 函数名称 写出函数的名称功能描述 描述出函数具有的功能函数参数 输入输出参数说明 对每个参数都需要作出仔细说明返回值 返回值说明 或者标明无回值模块历史 谁于某年某月某日创建本模块 创建人email谁于某年某月某日修改本模块 修改人email修改原因 可有可无 根据需要添加 58 例子 函数名称 main功能描述 输出Helloworld 函数参数 无返回值 无模块历史 张三于2006年9月20日创建本模块 email zhangsan intmain printf Helloworld return0 59 EnglishVersion FunctionName FunctionDescription DescriptionofwhatthefunctiondoesArguments OUT IN OUT argument name descriptionofargument ReturnValue return value descriptionofreturnvalueorNONEHistory Createdonmm dd yyyybyemail name 60 3 代码注释 61 恰到好处的注释 1 对重要变量说明其作用 2 对每一段函数代码加注释说明功能 3 对重要的语句加注释说明其功能 4 对重要的函数调用的参数加实际参数说明 5 在自己认为必要的地方加上注释6 可以采用 和 进行注释 62 4 基本编辑规范要求 正确使用 缩进 空格 空行 63 缩进 根据语句间的层次关系采用缩进格式书写程序 每进一层 往后缩进一层函数内的变量声明与执行语句要缩进一层缩进长函数调用语句pMsg ComReadMsgFromQueue aServer NULL ComWait c lTimeOut 一个缩进层次为四个英文字符宽度一般用Tab键进行缩进 定义Tab为四个英文字符宽度许多开发工具编辑器如VC一般会自动帮你缩进 64 要加空格的场合 1 在逗号后面和语句中间的分号后面加空格 如 inti j k for i 0 iba bi 03 关键字两侧 如if 不要写成if 4 类型与指针说明符之间一定要加空格 char szName 65 不要加空格的场合 1 在结构成员引用符号 和 左右两加不加空格 pStud szName Student nID2 不要在行尾加多余的空格或Tab3 函数名与左括号之间不要加空格 func 4 指针说明符号 与变量名间不要加空格 int pInt 不要写成 int pInt 5 复合运算符中间不能加空格 否则会产生语法错误 如 a b

温馨提示

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

评论

0/150

提交评论