c语言程序设计第08章善于使用指针.ppt

上传人:max****ui 文档编号:8617219 上传时间:2020-03-30 格式:PPT 页数:23 大小:631.81KB
返回 下载 相关 举报
c语言程序设计第08章善于使用指针.ppt_第1页
第1页 / 共23页
c语言程序设计第08章善于使用指针.ppt_第2页
第2页 / 共23页
c语言程序设计第08章善于使用指针.ppt_第3页
第3页 / 共23页
点击查看更多>>
资源描述
第8章善于使用指针 8 1什么是指针8 2指针变量8 3通过指针引用数组8 4通过指针引用字符串 8 1什么是指针 1指针是C语言的精华 灵魂 掌握指针的应用 可以使程序简洁 紧凑 高效 指针是内存单元的地址 1 定义变量 分配存储单元 2 存储单元 包含若干字节 3 每个字节都有一个编号 即地址 4 单元的地址是首字节的地址 即变量的地址 5 地址形象化地成为 指针 指针即地址 6 变量的地址即变量的指针 指针指向该变量单元 7 将变量的地址存放到一个变量中 此变量称指针变量 8 2指针变量 8 2 1指针变量的定义 初始化和引用1定义 inta b p q charch r 一般式 基类型 指针变量名 2定义指针变量时 可同时初始化 inta b p 注 指针变量只能存放地址 并且必须是与指针基类型相同类型的变量的地址 不能将一个整数赋给指针变量 2 通过指针变量引用指针变量所指的变量例如 inta b p q p 以八进制的数的形式输出指针变量p q的值 例8 2 p214 输入a b两个整数 按先大后小顺序输出 设计算法 使用指针 不交换两个整型变量的值 而是交换指针变量的值 编程序 includevoidmain inta b p p1 p2 p1 8 2 2指针变量作为函数参数同其他变量一样 指针变量也可以作函数的参数 作用是将一个变量的地址传送到另一个函数中 例8 3 p215 用函数实现将两个整数交换 然后在main函数中输出交换后的变量值 includevoidswap int p1 int p2 inttemp temp p1 p1 p2 p2 temp voidmain inta b q1 讨论 下列3个函数是否能完成交换两个变量的值 为什么 1 voidswap intx inty inttemp temp x x y y temp 2 voidswap int p1 int p2 int temp temp p1 p1 p2 p2 temp 3 voidswap int p1 int p2 int temp temp p1 p1 p2 p2 temp 结论 用指针作函数的参数 可以将多个值带回到主调函数 相当有多个返回值 8 3通过指针引用数组 8 3 1数组元素的指针数组中的每个元素同变量一样 都有相应的地址 即为数组元素的指针 也可以将此地址放到一个指针变量中 例如 inta 10 p p p 20 同a 3 20 注意 数组名是地址常量 是数组的首地址 亦是数组中首元素的地址 即元素a 0 的地址 8 3 2通过指针引用数组元素引进指针概念后 引用一个数组元素可以有2种方法 1 下标法 即数组名加下标 如a i 形式 2 指针法 即地址法 如 a i 同a i 一样 例8 6 p221 用不同的方法输出整数数组的元素值 includevoidmain inti j t a 20 p a for i 0 i 10 i scanf d for i 0 i 0 p printf 4d p printf n 分析下列方法正确否 for i 0 i 10 i printf 4d a printf n 总结 元素 a i a i p i p i 指针 a i a i p i 思考 如何用同样的方法完成输入 当指针变量p指向数组元素时 可以进行下列运算 p与整数做 加 减 运算如 p a 2 p p 1 即p指向了下一个元素 即是元素a 3 的地址 p p 1 即p指向了上一个元素 即是元素a 1 的地址 注 运算p p 1并不是简单的将p的值加1 而是加上一个数据元素所占的字节数 p p 1 d 一般情况下 p p i 实际是计算p p i d 减运算也一样 2 两个数组元素的指针可以进行 关系 运算如 p a 0 q a 2 则p 0 使用指向数组元素的指针变量p时 要注意 p可以指向不同的元素如 p a 0 p 即指向元素a 1 但a 是错误的 因为a是数组名 数组名是指针常量 不能改变它的值 2 注意指针变量的当前值 尤其注意其起始值 请看例8 7 p223 当指针变量值超出数组范围时 编译系统并不认为非法只有使用时保证不超出范围 否则会出现意想不到的错误 3 指针变量p也可以带下标 如p i 系统解释为 p i 此时要注意p的当前值 若p a 则p i 相当a i 若p a 2 则p i 相当a i 2 即p 3 相当时a 5 建议初学者少用这种容易出错的方法 8 3 3用数组名作函数参数在第7章中介绍过数组名做形参 如 voidsqrt inta intn voidmain intarray 10 p array sqrt array 10 也可以写成sqrt p 10 定义函数中 a是形参数组名 相当是指针变量 所以将函数首部写成 voidsqrt int a intn 是一样的 调用函数时 把实参数组名array 指针常量 传递给a 此时a和array指向同一个数组 因此在对形参a数组排序时 等于直接在实参数组array上完成 直接改变了数组元素值 用数组名作参数可以有4种不同的形式 用数组名作参数可以有4种不同的形式 形参实参数组名数组名指针变量数组名数组名指针变量指针变量指针变量注意 前面介绍过 用指针作函数的参数 可以将多个值带回到主调函数 相当有多个返回值 数组名是指针 因此在对形参数组进行改变时 等于直接在实参数组上完成 相当形参数组的所有值都返回给实参数组 例8 9 p228 用指针和函数完成选择法排序 8 4通过指针引用字符串 数组元素可以作为函数的参数 其用法与变量相同 数组名也可以作为函数的参数 传递的是数组首元素的地址 8 4 1数组元素作函数参数数组元素可以作为调用函数时的实参 传值给形参 数组元素不能作为函数的形参 例如 inta 10 x max a 1 a 2 求元素a 1 a 2 中大的 intmax intx inty 不能写成 intmax inta 1 inta 2 例7 6 P185 7 4 2数组名作函数参数数组名也可以作为函数调用时的实参 传递的是数组首元素的地址 即数组的首地址 不是将数组中的所有元素传递给形参 此时 对应的形参应当是数组名或指针变量 见第8章 例7 7 P186 例7 8 P188 includevoidmain floataverage floatarray 函数原型 floatscroe 10 aver aver average score 调用函数 数组名为实参 floataverage floatarray 数组名为形参 例7 9 P189 用一个函数实现选择法对10个数排序 includevoidsort inta intn 定义函数 数组名为形参 inti j k t for i 0 i n 1 i k i for j i 1 j n j if a j a k k j t a i a i a k a k t voidmain inta 10 12 6 3 7 4 9 13 2 10 8 sort a 10 调用函数 数组名为实参 7 5变量的作用域和生存期 7 5 1变量的作用域 局部变量和全局变量变量的作用域亦称有效范围 若程序中只包含一个main函数 则在函数中定义的变量在整个函数中都有效 当一个程序中包含多个函数时 在A函数中定义的变量在B函数中能否使用 这就是作用域问题 1局部变量在函数中定义的变量 只在本函数中有效 成为局部变量或内部变量 作用域只为本函数内 注 1 不同函数中的局部变量可以使用相同的名字 他们有各自的有效范围 互不影响 2 main函数中定义的变量也是局部变量 3 函数的形参也是局部变量 函数外不能引用 2 复合语句中可以定义变量 只在本语句中有效 2全局变量一个程序包含多个文件 一个文件可以包含多个函数 在函数外定义的变量是外部变量或全局变量 有效范围为从定义的位置开始 到文件的结束 当一个文件中全局变量与局部变量重名时 在局部变量的有效范围内 全局变量被 屏蔽 起来 即不起作用 当局部变量出了有效范围后 全局变量继续有效 例7 10请看下列程序的输出结果 intm 13 intfun2 intx inty intm 3 return x y m voidmain inta 7 b 5 printf d n fun2 a b m 7 5 2变量的存储方式和生存期除了作用域以外 变量还有一个重要的属性 生存期 即变量的存在时间 有些变量在程序运行的整个过程中都存在 而有些变量只在调用函数时才临时分配存储单元 函数调用结束马上就释放了 变量不再存在 即变量分为 静态存储方式和动态存储方式两种 亦称存储类别 由此可知 变量有两个属性 数据类型和存储类别 C语言中有4种存储类别 1auto 自动变量前面用过的函数中 定义的形参和局部变量都是自动变量 存储类别定义的关键字auto省略 属于动态存储方式 有效范围和生存期均为本函数 2static 静态变量函数中定义的局部变量静态变量 属于静态存储方式 有效范围为本函数 生存期为整个程序 例7 12分别求出1 5的阶乘值 并输出 p196 includeintfac intn staticintf 1 f为静态局部变量 f f n return f voidmain inti for i 1 i 5 i printf d d n i fac i 注 静态局部变量 f 的有效范围只限于函数fac 但是生存期是整个程序 即在fac函数外 它的值仍然存在 再次调用函数时 继续在前一个值上累乘 若静态局部变量在定义时未初始化 系统自动赋值为0 3registc 寄存器变量一般变量都存储在内存中 而寄存器变量存储在CPU的寄存器中 从而提高存取速度 现代的计算机 系统可以自动完成此功能 extern 外部变量的作用域扩展外部变量的作用域 习题 P208 1 2 3 4 6 7 8 10
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!