评估课件_指针.ppt_第1页
评估课件_指针.ppt_第2页
评估课件_指针.ppt_第3页
评估课件_指针.ppt_第4页
评估课件_指针.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

高级语言程序设计 授课班级 04通讯工程行知班上课地点 25 406授课时间 星期三1 2 3教学目标 利用指针进行编程授课方式 讲课教学方法 多媒体教学 重点难点 指针和指针变量的区别指针变量作为函数参数的应用指针作为数组元素的应用多维数组和指针的应用字符数组的应用 第10章指针 10 1地址和指针的概念10 2变量的指针和指向变量的指针变量10 3数组的指针和指向数组的指针变量10 4字符串的指针和指向字符串的指针变量10 5函数的指针和指向函数的指针变量10 6返回指针值的函数10 7指针数组和指向指针的指针10 8有关指针的数据类型和指针运算的小结 10 1地址和指针的概念 C语言中 将地址形象化地称为 指针 一个变量的地址称为该变量的 指针 例如 地址2000是变量i的指针 如果有一个变量专门用来存放另一变量的地址 即指针 则它称为 指针变量 请区分 指针 和 指针变量 这两个概念 举例 printf d i 的执行过程scanf d i 的执行过程直接访问方式 按变量地址存取变量值的方式称为 直接访问 方式 间接访问 的方式 将变量i的地址存放在另一个变量中 该变量是存放变量所占用单元的起始地址 要存取变量i的值 也可以采用间接方式 先找到存放 变量地址 的变量 再去找 变量的指针就是变量的地址 存放变量地址的变量是指针变量 用来指向另一个变量 符号表示 指向 表示指针变量和它所指向的变量之间的联系 例如 i pointer代表指针变量 而 i pointer是i pointer所指向的变量 10 2变量的指针和指向变量的指针变量 下面两个语句作用相同吗 i 3 i pointer 3 一般形式 基类型 指针变量基类型 用来指定该指针变量可以指向的变量的类型 例如 int pointer 1 pointer 2 char pointer 4 pointer 4是指向字符型变量的指针变量 pointer 1 100 10 2 1定义一个指针变量 怎样使一个指针变量指向另一个变量呢 pointer 1 在定义指针变量时要注意两点 1 指针变量前面的 表示该变量的类型为指针型变量 注意 指针变量名是pointer 1 pointer 2 而不是 pointer 1 pointer 2 2 在定义指针变量时必须指定基类型 请牢记 指针变量中只能存放地址 指针 有两个有关的运算符 1 取地址运算符 2 指针运算符 或称 间接访问 运算符 例如 a p例10 1通过指针变量访问整型变量 10 2 2指针变量的引用 对程序的说明 1 程序第5 6行的作用就是使pointer 1指向a pointer 2指向b 此时pointer 1的值为 a 即a的地址 pointer 2的值为 b 2 最后一行的pointer 1和 pointer 2就是变量a和b 最后两个printf函数作用是相同的 3 程序中有两处出现 pointer 1和 pointer 2 请区分它们的不同含义 4 第5 6行 pointer 1 因为a的地址是赋给指针变量pointer 1 而不是赋给 pointer 1 即变量a 对 语句 若有 pointer 1它的含义是什么 和 两个运算符的优先级相同 但按自右向左结合 因此 pointer 1与 a相同 即变量a的地址 2 a的含义是什么 3 pointer 1 相当于a 注意和 pointer 1 的区别 例10 2输入a和b两个整数 按先大后小的顺序输出a和b 注意 a和b并未交换 它们仍保持原值 但p1和p2的值改变了 例10 3题目同例10 2 即对输入的两个整数按大小顺序输出 10 2 3指针变量作为函数参数 对程序的说明 swap是用户定义的函数 它的作用是交换两个变量 a和b 的值 注意实参pointer 1和pointer 2是指针变量 在函数调用时 将实参变量的值传送给形参变量 采取的依然是 值传递 方式 注意 交换 p1和 p2的值如果写成swap int p1 int p2 int temp temp p1 此语句有问题 p1 p2 p2 temp 注意 不能企图通过改变指针形参的值而使指针实参的值改变 请看下面的程序 swap int p1 int p2 int p p p1 p1 p2 p2 p main inta b int pointer 1 pointer 2 scanf d d 例10 4输入a b C3个整数 按大小顺序输出 数组的指针是指数组的起始地址 数组元素的指针是数组元素的地址 引用数组元素的方法 下标法 指针法 10 3数组的指针和指向数组的指针变量 10 3 1指向数组元素的指针 对指针元素赋值 p 把a 0 元素的地址赋给指针变量p 也就是说 p指向a数组的第0号元素 p a 的作用是 把a数组的首地址赋给指针变量p 而不是 把数组a各元素的值赋给p int p a 的作用是将a的首地址 即a 0 的地址 赋给指针变量p 而不是赋给 p p已定义为指针变量 并已给它赋了一个地址 指向某一个数组元素 赋值语句 p 1 表示对p当前所指向的数组元素赋予一个值 值为1 则p 1指向同一数组中的下一个元素 10 3 2通过指针引用数组元素 如果p的初值为 a 0 则 1 p i和a i就是a i 的地址 2 p i 或 a i 是p i或a i所指向的数组元素 即a i 实际上是变址运算符 即将a i 按a i计算地址 然后找出此地址单元中的值 3 指向数组的指针变量也可以带下标 如p i 与 p i 等价 引用一个数组元素 可以用 1 下标法 如a i 形式 2 指针法 如 a i 或 p i 其中a是数组名 p是指向数组的指针变量 其初值p a 例10 5输出数组中的全部元素 假设有一个a数组 整型 有10个元素 要输出各元素的值有三种方法 1 下标法 2 通过数组名计算数组元素地址 找出元素的值 3 用指针变量指向数组元素 对三种方法的比较 1 第 1 和 2 种方法执行效率是相同的 找数组元素费时较多 2 第 3 种方法比 1 2 法快 用指针变量直接指向元素 不必每次都重新计算地址 像p 这样的自加操作是比较快的 这种有规律地改变地址值 p 能大大提高执行效率 3 用下标法比较直观 能直接知道是第几个元素 在使用指针变量时 要注意的问题 1 指针变量可以实现使本身的值改变 2 要注意指针变量的当前值 例10 6 3 虽然定义数组时指定它包含10个元素 可以用p指向当前的数组元素 但是实际上指针变量p可以指向数组以后的内存单元 如果引用数组元素a 10 C编译程序并不认为非法 系统把它按 a 10 处理 例10 6通过指针变量输出a数组的10个元素 4 注意指针变量的运算 如果先使p指向数组a 即p a 则 p 或p 1 使p指向下一元素 即a 1 若再执行 p 取出下一个元素a 1 值 p 由于 和 同优先级 结合方向为自右而左 因此它等价于 p 作用是先得到p指向的变量的值 即 p 然后再使p 1 p p 与 p 作用不同 前者是先取 p值 后使p加1 后者是先使p加1 再取 p p 表示p所指向的元素值加1 即 a 0 如果p当前指向a数组中第i个元素 则 p 相当于a i 先对p进行 运算 再使p自减 10 3 3用数组名作函数参数 f intarr intn f int arr intn 以上两种写法是等价的 需要说明的是 C语言调用函数时虚实结合的方法都是采用 值传递 方式 当用变量名作为函数参数时传递的是变量的值 当用数组名作为函数参数时 由于数组名代表的是数组起始地址 因此传递的值是数组首地址 所以要求形参为指针变量 说明 实参数组后代表一个固定的地址 或者说是指针型常量 而形参数组并不是一个固定的地址值 作为指针变量 在函数调用开始时 它的值等于实参数组起始地址 但在函数执行期间 它可以再被赋值 如 f arr intn printf d n arr 输出array 0 的值 arr arr 3 printf d n arr 输出array 3 的值 例10 7将数组a中n个整数按相反顺序存放 见图示意 程序执行示意图 例10 8从10个数中找出其中最大值和最小值 1 形参和实参都用数组名 如 main f intx intn inta 10 f a 10 如果有一个实参数组 想在函数中改变此数组的元素的值 实参与形参的表示形式有以下4种情况 2 实参用数组名 形参用指针变量 如 main f int x intn inta 10 f a 10 3 实参形参都用指针变量 例如 main f int x intn inta 10 p p a f p 10 4 实参为指针变量 形参为数组名 如 main f intx intn inta 10 p p a f p 10 例10 9用实参指针变量改写例10 7 应注意 如果用指针变量作实参 必须先使指针变量有确定值 指向一个已定义的数组 例10 10用选择法对10个整数排序 1 多维数组的地址设有一个二维数组a 它有3行4列 它的定义为inta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 10 3 4指向多维数组的指针和指针变量 从二维数组的角度来看 a代表整个二维数组的首地址 也就是第0行的首地址 a 1代表第1行的首地址 举例 例10 11输出二维数组有关的值 1 指向数组元素的指针变量 例10 12用指针变量输出数组元素的值 2 指向多维数组的指针变量 2 指向由m个元素组成的一维数组的指针变量 例10 13输出二维数组任一行任一列元素的值 注意应输入 i 1 j 2 以与scanf函数中指定的字符串相对应 p 4 这种形式不好理解 可以对下面二者做比较 inta 4 a有4个元素 每个元素为整型 int p 4 用指针变量作形参接受实参数组名传递来的地址时 有两种方法 用指向变量的指针变量 用指向一维数组的指针变量 例10 14有一个班 3个学生 各学4门课 计算总平均分数 以及第n个学生的成绩 3 多维数组的指针作函数参数 例10 15在上题基础上 查找有一门以上课程不及格的学生 打印出他们的全部课程的成绩 10 4 1字符串的表示形式访问一个字符串方法 1 用字符数组存放一个字符串 然后输出该字符串 例10 16 10 4字符串的指针和指向字符串的指针变量 2 用字符指针指向一个字符串 例10 18将字符串a复制为字符串b 例10 19用指针变量来处理例10 18问题 例10 20用函数调用实现字符串的复制 1 用字符数组作参数 10 4 2字符串指针作函数参数 用字符型指针变量 main函数可改写如下 main char a Iamateacher char b youareastudent printf stringa s nstringb s n a b Copy string a b printf nstringa s nstringb s n a b 2 形参用字符指针变量 3 对Copy string函数还可作简化 将Copy string函数改写为voidCopy string char from char to while to from 0 to from Copy string函数的函数体还可改为 while to from 0 函数体还可写成 while from 0 to from to 0 上面的while语句还可以进一步简化为下面的while语句 while to from 它与下面语句等价 while to from 0 函数体中while语句也可以改用for语句 for to from 0 或for to from 也可用指针变量 函数Copy string可写为voidCopy string charfrom charto char p1 p2 p1 from p2 to while p2 p1 0 用字符数组和字符指针变量实现字符串的存储和运算的区别 1 字符数组由若干个元素组成 每个元素中放一个字符 而字符指针变量中存放的是地址 字符串的首地址 决不是将字符串放到字符指针变量中 2 赋值方式 对字符数组只能对各个元素赋值 不能用以下办法对字符数组赋值 charstr 14 str IloveChina 10 4 3对使用字符指针变量和字符数组的讨论 3 对字符指针变量赋初值 char a IloveChina 等价于char a a IloveChina 4 如果定义了一个字符数组 在编译时为它分配内存单元 它有确定的地址 而定义

温馨提示

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

评论

0/150

提交评论