c语言从入门到精通第12章.ppt

上传人:max****ui 文档编号:6332788 上传时间:2020-02-23 格式:PPT 页数:41 大小:406.81KB
返回 下载 相关 举报
c语言从入门到精通第12章.ppt_第1页
第1页 / 共41页
c语言从入门到精通第12章.ppt_第2页
第2页 / 共41页
c语言从入门到精通第12章.ppt_第3页
第3页 / 共41页
点击查看更多>>
资源描述
第12章指针的深入研究 指针进阶 指针与数组指针与字符串综合应用 报数游戏跟我上机 第12章指针的深入研究 指针进阶 指针与数组指针与字符串综合应用 报数游戏跟我上机 第12章指针的深入研究 指针进阶 指针与数组指针与字符串综合应用 报数游戏跟我上机 第12章指针的深入研究 指针进阶 指针与数组指针与字符串综合应用 报数游戏跟我上机 第12章指针的深入研究 指针进阶 指针与数组指针与字符串综合应用 报数游戏跟我上机 12 1指针与数组 12 1 1指针与数组12 1 2数组名作为指针12 1 3指针与多维数组12 1 4指针与数组参数 12 1 1指针与数组 指针用于存储地址 他和数组名紧密的联系在一起 下图就显示了一个数组名称为grade 包含5个整型数据的一维数组 这里每个整型元素占用4个字节 12 1 1指针与数组 访问数组元素 我们可以使用下标来实现 比如我们要访问数组元素grade 3 在之前的章节里我们详细的讲解过 但是那时使用的方法其实隐藏了数组每一个元素的地址 根据之前讲过的地址的概念 加之我们已知的数组的特点 这个特点就是数组在内存总占用一块连续的存储区域 这样的话 如果我们知道数组的首地址 针对grade这个数组 就是已知grade 0 的地址 我们就可以通过增减偏移量 得到garde 3 的地址 从而访问到garde 3 的元素值 12 1 1指针与数组 12 1 1指针与数组 范例12 1 使用指针访问数组元素 分别使用下标和指针访问数组元素01 include02intmain void 03 04inti 05intgrade 2 5 9 4 6 06int p 07p 15 12 1 1指针与数组 需要注意的是 p i 表达式中的括号是必须有的 不能省略 如果我们遗漏了小括号 将变成这样的表达式 p i 它的含义之前在指针变量处已经进行了讲解 是在p所指向的存储单元的数值基础上在i 因为我们始终没有改变指针p的指向 12 1 2数组名作为指针 每个创建的数组 数组名就成为编译器为这个数组所创建的指针常量名称 存储的是数组第一个元素的起始地址 也是我们所说的数组首地址 这样 我们就有多了一种获取数组元素地址的手段 如 范例12 1 中代码 p 12 1 2数组名作为指针 范例12 2 使用数组名作为指针访问数组元素 01 include02intmain void 03 04inti 05intgrade 2 5 9 4 6 06int p 07p grade 指针赋值 08printf 使用数组名访问数组元素 n 09for i 0 i 5 i 使用数组名 10printf 数组grade的第 d个元素是 d n i grade i 11printf 使用数组指针访问数组元素 n 12for i 0 i 5 i 使用指针变量 13printf 数组grade的第 d个元素是 d n i p i 14return0 15 12 1 2数组名作为指针 面的代码大家一起来分析一下 看看错了吗 grade grade 3 结果是有误 原因是 grade是数组名 它是编译器为这个数组创建的指针常量 常量当然是不能够再赋值的 再看下面的代码 是否有问题 p grade p p 3 结果是正确的 原因是 p是指针变量 它初始值是grade数组的首地址 之后根据需要修改了p的值 也就是改变了指针变量p的指向 12 1 2数组名作为指针 范例12 3 已知一个含有10整型元素的一维数组array 使用指针 求出该数组的最大值 最小值和平均值 并输出 12 1 2数组名作为指针 范例12 4 有n个整数 存储在数组array中 使其前面各数顺序向后移m个位置 最后m个数变成最前面的m个数 并输出 12 1 3指针与多维数组 我们知道数组在内存中用连续的存储区域 这一点已经反复提到 我们以二维数组为例 数据是怎么存储的呢 假设存在二维数组array 2 3 那么这6个数据在内存中按照行走Z形排列 在内存储中存储形式如下图所示 12 1 3指针与多维数组 多维数组的数组名也被编译器创建为常量 用来存储该数组的首地址 数组名array存储的是array 0 0 元素的地址 也就是存储的值是 array 0 0 我们也可以按照首地址加偏移量的形式 从而使指针指向该数组中任何一个元素 实现多维数组和指针的关联 12 1 3指针与多维数组 下面我们逐步细分 让大家掌握 第一步 我们写出最容易理解的形式 array 1 2 指的是一个元素 array 1 2 指的是array 1 2 元素的地址 然后 我们深入一步 array 指的是数组下标为0的那一行的首地址 array 1 指的是数组下标1的那一行的首地址 array 1 指的也是数组下标1的那一行的首地址 12 1 3指针与多维数组 接下来 我们进一步深入 array 1 等价array 1 0 于指的也是array 1 0 元素的地址 array 1 2 指的也是array 1 2 元素的地址 array 1 2 指的也是array 1 2 元素的地址 最后 array 1 2 指的是元素array 1 2 值 array 1 2 指的是元素array 1 2 值 12 1 3指针与多维数组 范例12 5 使用指针访问二维数组 12 1 4指针与数组参数 1 第一种情况 实参是数组 形参也是数组主调函数 intarr 10 function arr 被调函数 function intarr 12 1 4指针与数组参数 2 第二种情况 实参是数组 形参是数组指针主调函数 intarr 10 function arr 被调函数 function int p 12 1 4指针与数组参数 3 第三种情况 实参是数组指针 形参是数组指针 主调函数 intarr 10 int p arr function p 被调函数 function int q 12 1 4指针与数组参数 4 第四种情况 实参是数组指针 形参是数组 主调函数 intarr 10 int p arr function p 被调函数 function intarr 12 1 4指针与数组参数 范例12 6 统计在array字符串中从 a 到 z 的26个小写字母各自现的次数 例如 输入字符串 abcdefgabcdeabc 输出的结果应该是 333222110000000000000000000 12 2指针与字符串 12 2 1使用指针创建字符串12 2 2使用指针处理字符串12 2 3指针的指针12 2 4指针数组和数组指针 12 2 1使用指针创建字符串 字符串的定义自动就包含指针 例如 我们定义message1 100 为100个字符声明存储空间 并自动的创建一个包含指针常量message1 是存储的是message1 0 的地址 跟一般的常量一样 指针常量指向是明确的 不能被修改 对于字符串 我们可以不按照声明一般数组的方式 定义数组维数和每一维的个数 还可以使用新的方法 也就是我们要讲解的用指针创建字符串 例如下面的代码 char message2 howareyou 这个message1和message2是不同的 message1是按照数组定义方式定义的 如 charmessage1 100 howareyou 12 2 1使用指针创建字符串 这种形式要求 message1有固定的存储该数组的空间 而且 因为message1本身是数组名称 一旦被初始化后 再执行下面的语句就是错误的 如message1 fine andyou message2本身就是一个指针变量 它通过显式的方式明确了一个指针变量 对于message2执行了初始化后 再执行下面的代码是正确的 message2 fine andyou 从分配空间的角度来分析 二者也是不同的 message1指定了一个存储100个字符位置的空间 而对于message2就不同了 它只能存储一个地址 它只能保存指定字符串的第一个字符的地址 12 2 1使用指针创建字符串 范例12 7 八进制转十进制 01 include02intmain void 03 04char p s 6 05intn 06n 0 07p s 字符指针p指向字符数组s 08printf 输入你要转换的八进制数 n 09gets p 输入字符串 10while p 0 检查指针是否都字符数组结尾 11 12n n 8 p 0 八进制转十进制计算公式 13p 指针后移 14 15printf 转换的十进制是 n d n n 16return0 17 12 2 2使用指针处理字符串 范例12 8 字符串复制01 include02intmain void 03 04charstr1 10 str2 10 05char p1 p2 06p1 str1 07p2 str2 08printf 请输入原字符串 n 09gets p2 10for p2 0 p1 p2 循环复制str2中的字符到str1 11 p1 p2 12 p1 0 str1结尾补 0 13printf 原字符串是 s n复制后字符串是 s n str2 str1 14return0 15 12 2 2使用指针处理字符串 这道题目声明了两个字符串的指针 通过指针移动 赋值字符串str2中的字符到str1 并且在str1结尾添加了字符串结束标志 需要说明以下两点 如果题目中没有使用指针变量 而是直接在for循序中使用了str1 这样的表达式 程序就会出错 因为str1是字符串的名字 是常量 如果没有写 p1 0 这行代码 输出的目标字符串长度是9位 而且很可能后面的字符是乱码 因为str1没有结束标志 直至遇见了声明该字符串时设置好的结束标志 0 12 2 2使用指针处理字符串 范例12 9 字符串连接 12 2 2使用指针处理字符串 范例12 10 已知一个字符串 使用返回指针的函数 实现这样的功能 把该字符串中的 号删除 同时把后面连接的字符串前移 12 2 3指针的指针 范例12 11 使用指针的指针访问字符串数组 01 include02intmain void 03 04char array Winter Spring Summer Fall 05char p 指针的指针 06inti 07for i 0 i 4 i 08 09p array i 指针的指针p指向array i所指向的字符串的首地址 10printf s n p 输出数组中的每一个字符串 11 12return0 13 12 2 3指针的指针 12 2 4指针数组和数组指针 什么是指针数组呢 指针数组是指数组由指针类型的元素组成 比如 int p 10 这里数组p是由10个指向整型元素的指针组成的 比如p 0 就是一个指针变量 它的使用跟一般的指针用法一样 无非是这些指针有同一个名字需要使用下标来区分 例如我们有下面的定义 char p 2 chararray 2 20 p 0 array 0 p 1 array 1 如下图所示 12 2 4指针数组和数组指针 数组指针 比如 int p 10 指针p用来指向含有10个元素的整型数组 范例12 12 使用数组指针 01 include02intmain void 03 04intarray 2 3 1 2 3 4 5 6 05inti j 06int p 3 07p array p指向array下标为0那行的首地址 08for i 0 i 2 i 09 10for j 0 j 3 j 11printf array d d d n i j p i j 12 13return0 14 12 3综合应用 报数游戏 范例12 13 有n个人围成一圈 顺序排号 从第一个人开始报数 从1到3报数 凡报到3的人退出圈子 问最后留下的那位是原来的第几号 12 5跟我上机 1 编写C程序 使用指针 实现以下功能 编一个函数fun char s 函数的功能是把字符串中的内容逆置 如 字符串中原有的内容为 abcdefg 则调用该函数后 串中的内容为 gfedcba 12 5跟我上机 2 编写C程序 使用指针 实现以下功能 统计 ABCEJFAHADBDEBBFQPMDNBB 字符串中字母B的个数 移除所有字符 B 后面所跟的字符串
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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