




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章指针 教学要求 通过本章的教学 学习者应该深刻理解指针的概念及其内涵 掌握指针变量的定义和使用方法 能合理利用指针变量编制功能函数 解决简单的实际问题 理解指针变量与一维数组的关系 能熟练运用指向一维数组的指针变量操纵数组元素 同时 能正确利用字符串指针处理字符串的相关问题 教学提示 指针是C语言的精髓 不能熟练地使用指针 就相当于没学到C语言的精华 指针是一种数据类型 指针类型的变量被初始化后 就存储了地址值 利用指针变量可方便地操作数组和字符串 1 第8章指针 教学内容 本章首先介绍了C语言指针的概念 接着给出了C语言中指针变量的定义方式 以及指针变量的使用方式 在大致建立了指针的概念后 本章还介绍了指向一维数组的指针变量和指向字符串的指针变量的简单用法 为后续学习结构体与共用体的知识 奠定了基础 2 第8章指针 8 1指针的概念8 1 1变量存储的相关概念内存地址计算机硬件系统的内存储器中 拥有大量的存储单元 一般把存储器中的一个字节称为一个内存单元 不同的数据类型的变量所占用的内存单元数不等 为了正确地访问这些内存单元 必须为每个内存单元编上号 根据一个内存单元的编号即可准确地找到该内存单元 内存单元的编号也叫做 内存地址 每个存储单元都有一个唯一的地址 请务必注意 内存单元的地址与内存单元中的数据是两个完全不同的概念 3 第8章指针 变量名 变量地址和变量值 变量名 是给内存空间取的一个容易记忆的名称 变量地址 是系统分配给变量的内存单元的起始地址 变量值 是变量的地址所对应的内存单元中所存放的数值 或内容假如有一幢教师办公楼 各房间都有一个编号 如 1001 1002 1003 一旦各房间被分配给相应的系部部门后 各房间就挂起了部门名称牌 如 计算机系 电子工程系 工商管理系 通信工程系等 假设计算机系被分配在1001房间 若要找计算机系的教师 即值或内容 可以去找计算机系 按名称找 也可去找1001房间 按地址找 4 第8章指针 凡在程序中定义的变量 当程序编译时 系统都会给它们分配相应的存储单元例如 inta 7 b 8 floatc 2 7 要访问内存中的变量 在程序中是通过变量名来引用变量的值的 例如printf d a 实际上 在编译时将每一个变量名对应一个地址 在内存中不再出现变量名而只有地址 程序中若引用变量a 系统便会找到其对应的地址2000 然后从2000和2001这两个字节中取出其中的值 又如scanf d b 其中的 b指的是变量b的地址 是地址运算符 执行scanf函数时 将从键盘输入一个整数值送到 b 即地址2002 所标示的存储单元中 5 第8章指针 8 1 2变量的访问方式直接访问由以上分析可以知道 要访问变量 必须通过地址找到该变量的存储单元 由于通过地址可以找到变量单元 因此可以说一个地址 指向 一个变量存储单元 譬如 地址2000指向变量a 2002指向变量b等 这种通过变量名或地址访问一个变量的方式称为 直接访问 用变量名对变量的访问也属于 直接访问 因为在编译后 变量名和变量地址之间建立了对应关系 对变量名的访问 系统会自动转换成利用地址对变量的访问 6 第8章指针 间接访问还有一种 间接访问 方式 就是把一个变量的地址放在另一个变量中 利用这个 特殊 的变量进行访问 特殊 变量p存放的内容是变量d的地址 利用变量p来访问变量d的方法称为 间接访问 存放地址的变量是一种特殊的变量 它只能用来存放地址 而不能用来存放其它类型 如整型 实型 字符型 的数据 需要专门加以定义 7 第8章指针 两种访问方式的比较假设为了开一个A抽屉 有两种办法 一种是将A钥匙带在身上 需要时直接找出该A钥匙打开抽屉 取出所需的东西 这相当于直接访问 另一种办法是 为安全起见 将该A钥匙放到另一抽屉B中锁起来 如果需要打开A抽屉 就需要先找出B钥匙 打开B抽屉 取出A钥匙 再打开A抽屉 取出A抽屉中之物 这就是 间接访问 8 第8章指针 8 2指向变量的指针变量指针变量和普通变量一样占用一定的存储空间 但指针变量存储空间中存放的不是普通的数据 而是一个地址 指针变量是一个地址变量8 2 1指针变量的定义及初始化1 指针变量的定义C语言规定所有变量在使用前必须定义 指定其类型 系统按数据类型分配内存单元 指针变量不同于整型变量和其他类型的变量 它是专门存放地址的 必须将它定义为 指针类型 格式 基类型 指针变量名 基类型 是该指针变量所指向的变量的类型 也就是指针变量所存储变量地址的那个变量的类型 9 第8章指针 基类型 是该指针变量所指向的变量的类型 也就是指针变量所存储变量地址的那个变量的类型例如 以下分别定义了基类型为整型 实型和字符型的指针变量p point1 point2 int p float point1 char point2 有了以上定义 则指针变量p只能存储int类型变量的地址 point1只能存储float类型变量的地址 point2只能存储字符型变量的地址 10 第8章指针 2 指针变量的初始化如何使一个指针变量指向一个普通类型的变量 只要将要需要指向的变量的地址赋给相适应的指针变量就行了int p inti 3 p 11 第8章指针 8 2 2指针变量的引用1 指针运算符 1 取地址运算符 取地址运算符 是单目运算符 其结合性为自右至左 其功能是取变量的地址 2 取内容运算符 取内容运算符 也叫间接引用运算符 其结合性为自右至左 用来表示指针变量所指的变量 在 运算符后跟的变量必须是指针变量 取内容运算符 与前面指针变量定义时出现的 意义完全不同 指针变量定义时 仅表示其后的变量是指针类型变量 是一个标志 而取内容运算符是个运算符 其运算后的值是指针所指向的对象的值 12 第8章指针 例如inty 5 int yptr yptr 由于把y的地址赋给了指针变量yptr 因此 指针变量yptr就存储了y的地址 也就是说 指针变量yptr指向了y 13 第8章指针 例如chari j p1 p2 i a j b p1 14 第8章指针 2 指针变量的算术操作允许用于指针的算术操作只有加法和减法intn p 表达式p n n 0 指向的是p所指的数据存储单元之后的第n个数据存储单元 而不是简单地在指针变量p的值上直接加个数值n 其中数据存储单元的大小与数据类型有关又如 若指针变量p1是整型的指针变量 其初始值为2000 整型的长度是两个字节 则表达式 p1 是使p1的值变成2002 而不是2001 每次增量之后 p1都会指向下一个单元 同理 当p1的值为2000时 表达式 p1 使p1的值变成1998 3 指针值的比较使用关系运算符 和 可以比较指针值的大小 如果p和q是指向相同的类型的指针变量 并且p和q指向同一段连续的存储空间 如p和q都指向同一个数组的元素 p的地址值小于q的值 则表达式p q的结果为1 否则表达式p q结果为0 15 第8章指针 P148例8 1P148例8 2P149例8 3 16 第8章指针 8 2 3指针变量作函数参数函数的参数不仅可以是整型 实型和字符型 还可以是指针类型 当是指针类型时 它的作用是将一个变量的地址传送到另一个函数中 C语言中函数参数的传递是传值的 即单向值传递 数值只能从调用函数向被调用函数传递 不能反过来传递 形参值的改变不会反过来影响实参值的改变 如例8 4 17 第8章指针 此例中 i和j的值正确传入了函数swap中 a和b是函数swap的两个形参 a和b的值是由i和j复制得到的 是i和j的一个副本 在swap函数调用返回的时候 a和b两个形参的生命周期结束 但它们的值并没有被复制回实参i和j中 因此 一旦返回 i和j的值将保持不变 函数swap的交换功能也没得到体现 但用指针作为函数的参数 情况就不一样了 18 第8章指针 P151例8 5传进函数的实参i和j的地址 被复制给swap的形参a和b a和b也是指针 在swap函数里 改变的不是a和b的值 而是 a和 b的值 运算符是得到指针所指向内存空间的内容 a取得的是存在a里的地址处的值 现在a里存在的地址是i的地址 因此 a在本程序中等价于i 同样道理 b等价于j 函数将i和j的内容交换 返回后 i和 j的值 地址 仍不变 而i和j的值却改变了 19 第8章指针 P152例8 6程序分析 swap函数是用户定义的函数 它的作用是交换两个变量 a和b 的值 swap函数的形参p1和p2是指针变量 程序运行时 先执行main函数 输入a 79和b 97 然后将a和b的地址分别赋给指针变量pointer1和pointer2 使pointer1指向a pointer2指向b 20 第8章指针 当执行到if语句时 由于a b为真 因此执行swap函数 注意实参pointer1和pointer2是指针变量 在函数调用时 将实参变量的值传递给形参变量 采取的依然是 值传递 方式 因此虚实结合后 形参p1的值为 a p2的值为 b 此时 p1和pointer1指向变量a p2和pointer2指向变量b 21 第8章指针 执行swap函数的函数体时 使 p1和 p2的值互换 也就是使a和b的值互换 函数调用结束后 p1和p2不复存在 已释放 P153例8 7 22 第8章指针 8 3指向一维数组的指针变量8 3 1一维数组指针的概念一个变量有地址 一个数组包含若干元素 每个数组元素都在内存单元中占用存储单元 它们都有相应的首地址 数组名是数组的首地址 不能说是数组元素的首地址 针对同一个数组来说 它是一个常量 所谓数组的指针是指数组的起始地址 事实上也就是数组名 一个数组是由连续的一块内存单元组成的 数组名就是这块连续内存单元的首地址 一个数组也是由各个数组元素 下标变量 组成的 每个数组元素按其类型不同占用几个连续的内存单元 指针变量既然可以指向一般变量 当然也可以指向数组元素 数组元素的指针是数组元素的地址 一个数组元素的首地址也是指它所占有的几个内存单元的首地址 23 第8章指针 8 3 2一维数组的指针表示方法如果有一个数组a inta 5 1 3 5 7 9 元素a 0 的地址是a的值 即1010 元素a 1 的地址是a 1 同样道理 a i是元素a i 的地址 24 第8章指针 值得特别注意的是 此处的a i并非简单的在首地址a上加个数字i 编译系统计算实际地址时 a i中的i要乘上数组元素所占的字节数 即 实际地址 a i 单个元素所占的字节数 其中单个元素所占的字节数由数据类型决定 例如元素a 3 的实际首地址是a 3 2 整型数据占2个字节 最终结果为1010 3 2 1016 25 第8章指针 定义一个指向数组元素的指针变量的方法 与以前介绍的指针变量定义方法相同 例如 inta 20 int p 定义p为指向整型变量的指针变量 p 26 第8章指针 8 3 3一维数组元素的引用方法为了引用一个数组元素 可以用两种不同的方法 一种是下标法 即指出数组名和下标值 系统会找到该元素 如a 3 另一种方法是指针法 也叫地址法 就是通过给出的数组元素地址访问某一元素 例如 通过地址a 3可以找到数组元素a 3 而 a 3 的值就是元素a 3 的值下标法P155例8 8地址法P155例8 9 27 第8章指针 8 3 4通过指针引用数组元素C语言规定 如果p为指向某一数组的指针变量 则p 1指向同一数组中的下一个元素 如果有如下语句 intarray 10 pointer array pointer i和array i都是数组元素array i 的地址 28 第8章指针 pointer i 和 array i 就是数组元素array i 指向数组的指针变量被赋值为数组名后也可按下标法来使用 例如 array i 等价于 pointer i 数组名是指针常量 始终是指向数组的首地址 而指针是一个变量 可以实现本身值的改变 如有数组a和指针变量p 则以下语句是合法的 p a p p 3 而 a 与 a p 都是错误的 29 第8章指针 在使用中应注意 p 与 p 的区别若p的初值为a 则 p 等价于a 0 p 等价于a 1 而 p 表示p所指向的元素值加1 如果p当前指向a数组中的第i个元素 则有 p 等价于a i p 等价于a i p 等价于a i P157例8 10 30 第8章指针 8 4指向字符串的指针变量字符串实际上是内存中一段连续的字节单元中存储的字符的总和 最后用 0 作为结束标志 指向字符串的指针称为字符串的指针 其类型是char 或unsignedchar 例如 char s hello 其中 s是一个字符串指针 在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 德州历史期末考试题目及答案
- 可用性测试方法创新-洞察及研究
- 2025年公需科目考试试卷考试参考答案
- 2025秋季开学典礼小学校长致辞:让“加减乘除”伴我们快乐成长
- 2025年高级会计师考试题目+参考答案
- 新疆政史考试题库及答案
- 人行金库账户管理办法
- 《警衔管理办法》违法
- 营业外收入管理办法
- 课程成绩管理办法江西
- 外包特殊过程管理办法
- 朋友圈点赞活动方案
- 2026年中考道德与法治一轮复习:重点考点知识分类背诵提纲
- 劳动防护用品穿戴使用标准培训
- 实验室危险化学品安全培训
- 无人机测绘中职教学计划
- 2025至2030中国水电工程监理行业发展趋势分析与未来投资战略咨询研究报告
- 小学生队形队列班会课件
- 2025至2030中国婚介服务行业产业运行态势及投资规划深度研究报告
- 绿色系古风类中国传统文化漆扇介绍模板
- 协会工资薪酬管理制度
评论
0/150
提交评论