C语言 chap11ppt课件_第1页
C语言 chap11ppt课件_第2页
C语言 chap11ppt课件_第3页
C语言 chap11ppt课件_第4页
C语言 chap11ppt课件_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

Chap11指针进阶 11 1布袋中的彩色球11 2解密藏头诗11 3学生信息管理的链表实现 本章要点 指针数组和指向指针的指针是如何被定义和使用的 指针如何作为函数的返回值 指向函数的指针的意义是什么 什么是结构的递归定义 哪种应用需要这种定义方法 对链表这种数据结构 如何进行动态内存分配操作 如何建立单向链表并实现插入 删除以及查找操作 11 1布袋中的彩色球 11 1 1程序解析11 1 2指针数组的概念11 1 3指向指针的指针11 1 4用指针数组处理多个字符串11 1 5命令行参数 11 1 1程序解析 例11 1已知一个不透明的布袋里装有红 蓝 黄 绿 紫同样大小的圆球各一个 现从中一次抓出两个 问可能抓到的是什么颜色的球 程序解析 例11 1源程序 includeintmain void char color 5 red blue yellow green purple 初始化 intcount 0 i j for i 0 i 4 i i代表第一个球对应的颜色下标 for j 0 j 4 j j代表第二个球对应的颜色下标 if i j continue 两个球不能同色 count printf 6d count printf 10s 10s n color i color j return0 1redblue2redyellow3redgreen4redpurple5blueyellow6bluegreen7bluepurple8yellowgreen9yellowpurple10greenpurple 指针数组 11 1 2指针数组的概念 char color 5 类型名 数组名 数组长度 数组元素是指针类型 用于存放内存地址inta 10 a是一个数组 它有10个元素每个元素的类型都是整型char color 5 color是一个数组 它有5个元素每个元素的类型都是字符指针 char color 5 red blue yellow green purple color是一个数组 它有5个元素每个元素的类型都是字符指针数组元素可以处理字符串对指针数组元素的操作相当于对同类型指针变量的操作printf 10s 10s n color i color j 指针数组的概念 includeintmain void inti char color 5 red blue yellow green purple tmp for i 0 i 5 i 输出字符串的地址和内容 printf x s n color i color i tmp color 0 交换color 0 与color 4 color 0 color 4 color 4 tmp printf color 0 s color 4 s n color 0 color 4 return0 420064 red42005c blue420054 yellow42004c green420044 purplecolor 0 purple color 4 red 例11 2使用指针数组输出5种颜色的英文名称 交换color 0 与color 4 的值 例11 2图示 11 1 3指向指针的指针 示例 例11 3改写例11 1 用指向指针的指针实现 includeintmain void char color 5 red blue yellow green purple char pc color intcount 0 i j for i 0 i 4 i for j 0 j 4 j if i j continue count printf 6d count printf 10s 10s n color i color j return0 指向指针的指针 pc i pc j 指向指针的指针 示例分析 char color 5 red blue yellow green purple char pc color printf 10s 10s n pc i pc j pc color或者 color 0 pc color 0 red pc i color i color 0 r pc color 0 r 指向指针的指针 定义 指向指针的指针 二级指针 类型名 变量名inta 10 int p inta 10 b 20 t int pa 例11 4 操作 1 ppt ppb ppb ppa ppa ppt 操作 2 pt pb pb pa pa pt 操作 3 t b b a a t 11 1 4用指针数组处理多个字符串 处理多个字符串二维字符数组charccolor 7 red blue yellow green purple 指针数组char pcolor red blue yellow green purple 使用指针数组更节省内存空间 1 用指针数组处理多个字符串 排序 例11 5将5个字符串从小到大排序后输出 includeintmain void inti inta 5 6 5 2 8 1 voidfsort inta intn fsort a 5 for i 0 i 5 i printf d a i return0 includeintmain void inti char pcolor 5 red blue yellow green purple voidfsort char color intn fsort pcolor 5 for i 0 i 5 i printf s pcolor i return0 例11 5字符串排序 voidfsort inta intn intk j inttemp for k 1 ka j 1 temp a j a j a j 1 a j 1 temp voidfsort char color intn intk j char temp for k 1 k0 temp color j color j color j 1 color j 1 temp pcolor 0 pcolor 1 pcolor 2 pcolor 3 pcolor pcolor 4 排序前 pcolor 0 pcolor 1 pcolor 2 pcolor 3 pcolor pcolor 4 排序后 2 动态输入多个字符串 示例 用动态分配内存的方法处理多个字符串的输入示例例11 6输入一些球的颜色 以 作为输入结束标志 再输出这些颜色 其中颜色数小于20 颜色的英文名称不超过10个字符 include include includeintmain void inti n 0 char color 20 str 10 printf 请输入颜色名称 每行一个 结束输入 n scanf s str while str 0 color n char malloc sizeof char strlen str 1 strcpy color n str n scanf s str printf 你输入的颜色是 for i 0 i n i printf s color i return0 请输入颜色名称 每行一个 结束输入 redblueyellow 你输入的颜色是 redblueyellow 3 对指针数组的进一步讨论 char color red blue yellow green purple color 二级指针 char color 0 color 2 指向color 2 color 2 和color 2 等价color 0 指向字符串 red 的首字符rcolor 0 2 指向首字符r后的第2个字符d 对指针数组的进一步讨论 1 color k color k printf s color 2 printf s color 2 2 color k j color k j color k j printf c c color 2 color 2 2 printf c c color 2 0 color 2 2 11 1 5命令行参数 C语言源程序经编译和连接处理 生成可执行程序后 才能运行 在DOS环境的命令窗口中 输入可执行文件名 就以命令方式运行该程序 输入命令时 在可执行文件 命令 名的后面可以跟一些参数 这些参数被称为命令行参数 testworld 命令名 命令行参数 include test c intmain printf HelloWorld return0 命令行参数 命令名参数1参数2 参数n命令名和各个参数之间用空格分隔 也可以没有参数使用命令行的程序不能在编译器中执行 需要将源程序经编译 链接为相应的命令文件 一般以 exe为后缀 然后回到命令行状态 再在该状态下直接输入命令文件名 带参数的main 函数 intmain intargc char argv 第1个参数argc接收命令行参数 包括命令名 的个数第2个参数argv接收以字符串常量形式存放的命令行参数 命令名本身也作为一个参数 include test c intmain intargc char argv printf Hello printf s argv 1 return0 testworld Helloworld argc 2 argv test world 例10 7输出命令行参数 例11 7编写C程序echo 它的功能是将所有命令行参数在同一行上输出 includeintmain intargc char argv intk for k 1 k argc k 从第1个命令行参数开始 printf s argv k 打印命令行参数 printf n return0 在命令行状态下输入 echoHowareyou Howareyou 11 2解密藏头诗 11 2 1程序解析11 2 2指针作为函数的返回值11 2 3指向函数的指针 11 2 1程序解析 解密藏头诗 例11 8输入一首藏头诗 假设只有4句 输出其真实含义 藏头诗 将这首诗每一句的第一个字连起来 所组成的内容就是该诗的真正含义 11 2 1程序解析 includechar change chars 20 chart intmain void inti chars 4 20 t 10 p printf 请输入藏头诗 n for i 0 i 4 i scanf s s i p change s t printf s n p return0 请输入藏头诗 一叶轻舟向东流 帆梢轻握杨柳手 风纤碧波微起舞 顺水任从雅客悠 一帆风顺 char change chars 20 chart inti for i 0 i 4 i t 2 i s i 0 t 2 i 1 s i 1 t 2 i 0 returnt printf s n change s t 或change s t printf s n t 11 2 2指针作为函数的返回值 函数返回值的类型整型 字符型 浮点型 结构类型指针 返回一个地址 函数的定义 调用方法与其他函数一样 指针作为函数的返回值 例11 9 输入一个字符串和一个字符 如果该字符在字符串中 就从该字符首次出现的位置开始输出字符串中的字符 要求定义函数match s ch 在字符串s中查找字符ch 如果找到 返回第一次找到的该字符在字符串中的位置 地址 否则 返回空指针NULL 例如 输入字符r和字符串program后 输出rogram 例11 9源程序 includechar match char s charch while s 0 if s ch return s 若找到字符ch 返回相应的地址 elses return NULL 没有找到ch 返回空指针 intmain void charch str 80 p NULL printf PleaseInputthestring n scanf s str getchar ch getchar if p match str ch NULL printf s n p elseprintf NotFound n return0 PleaseInputthestring Universityvversity 字符指针p接收match返回的地址 从p指向的存储单元开始 连续输出其中的内容 直至 0 为止 PleaseInputthestring schoolaNotFound 指针作为函数的返回值的进一步讨论 函数返回值的类型整型 字符型 浮点型 结构类型指针 返回一个地址 函数的定义 调用方法与其他函数一样进一步讨论定义函数时 可以 动态分配内存操作这些新分配的单元返回新分配单元的地址 修改例11 8 采用动态分配内存的方法 例11 8修改 动态分配内存 include includechar change d chars 20 intmain void inti chars 4 20 p NULL printf 请输入藏头诗 n for i 0 i 4 i scanf s s i p change d s printf s n p return0 char change d chars 20 inti char head p p char calloc 8 sizeof char head p for i 0 i 4 i p s i 0 p s i 1 p 0 returnhead 11 2 3指向函数的指针 每个函数都占用一段内存单元 有一个入口地址 起始地址 函数名 函数的入口地址函数指针 一个指针变量 接收函数的入口地址 让它指向函数通过函数指针调用函数做为函数的参数 函数指针的定义和赋值 定义类型名 变量名 所指向函数的返回值的类型int funptr 定义一个函数指针funptfunpt指向一个返回值类型为int的函数赋值funptr fun 函数fun的入口地址赋给funptrfunptr指向函数fun intfun x y returnx y x y 通过函数指针调用函数 int funptr funptr fun 调用函数函数名z fun 3 5 函数指针 funptr 3 5 函数指针名 参数表 intfun x y returnx y x y 函数指针做为函数的参数 实参 函数名或已赋值的函数指针形参 函数指针 指向实参所代表函数的入口地址例11 10编写一个函数calc f a b 用梯形公式求函数f x 在 a b 上的数值积分 然后调用calc f a b 计算下列数值积分 分析 函数定义时 形参 函数指针f 积分区间上下限参数a b函数调用时 实参 被积函数的名称 或函数指针 和积分区间的上下限 例11 10源程序 doublef1 doublex return x x doublef2 doublex return sin x x doublecalc double f double doublea doubleb doublez z b a 2 f a f b 调用f指向的函数 return z intmain void doubleresult result calc f1 0 0 1 0 函数名f1作为函数calc的实参 printf 1 resule 4f n result funp f2 result calc funp 1 0 2 0 函数指针funp作为函数calc的实参 printf 2 resule 4f n result return0 1 resule 0 50002 resule 0 6481 11 3学生信息管理的链表实现 11 3 1程序解析11 3 2链表的概念11 3 3单向链表的常用操作 11 3 1程序解析 例11 11建立一个学生成绩信息 包括学号 姓名 成绩 的单向链表 学生记录按学号由小到大顺序排列 要求实现对成绩信息的插入 修改 删除和遍历操作 例11 11数据定义与函数声明 structstud node 链表结点类型 intnum charname 20 intscore structstud node next structstud node Create Stu Doc 新建链表 structstud node InsertDoc structstud node head structstud node stud 插入 structstud node DeleteDoc structstud node head intnum 删除 voidPrint Stu Doc structstud node head 遍历 11 3 2链表的概念 一种动态存储分布的数据结构若干个同一结构类型的 结点 依次串接而成单向链表 双向链表 头指针 结点 尾结点 链表的概念 结点定义 structstud node intnum charname 20 intscore structstud node next 结构的递归定义 链表的概念 与数组比较 数组事先定义固定长度的数组在数组元素个数不确定时 可能会发生浪费内存空间的情况链表动态存储分配的数据结构根据需要动态开辟内存空间 比较方便地插入新元素 结点 使用链表可以节省内存 提高操作效率 动态存储分配函数malloc void malloc unsignedsize 在内存的动态存储区中分配一连续空间 其长度为size若申请成功 则返回一个指向所分配内存空间的起始地址的指针若申请不成功 则返回NULL 值为0 返回值类型 void 通用指针的一个重要用途将malloc的返回值转换到特定指针类型 赋给一个指针 malloc 示例 int ip int malloc sizeof int structstudent p p structstudent malloc sizeof s

温馨提示

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

评论

0/150

提交评论