C语言课件第10章指针.ppt

上传人:max****ui 文档编号:6335117 上传时间:2020-02-23 格式:PPT 页数:56 大小:430.31KB
返回 下载 相关 举报
C语言课件第10章指针.ppt_第1页
第1页 / 共56页
C语言课件第10章指针.ppt_第2页
第2页 / 共56页
C语言课件第10章指针.ppt_第3页
第3页 / 共56页
点击查看更多>>
资源描述
第10章指针 主要内容 1 指针和地址 2 指针常量和指针变量 3 指针与数组的结合应用 4 指针与函数的结合应用 5 指针数组与指向指针的指针变量重点 指针变量的定义与引用通过指针访问数组元素指针变量作为函数参数返回指针值的函数 10 1指针和指针变量 例10 1 数据的直接访问与间接访问 main ap inta p FFD6Hscanf d 输出变量p的值 即a的地址 指针 就是地址 变量的指针即指向该变量的地址 指针变量 存放内存 变量 数组 函数等 地址的变量 指针变量 例10 2交换两个指针变量所指向的变量的值 main inta 10 b 20 t int p1 p2 定义指向整型的指针变量p1 p2 p1 图示其执行过程 见下页 本例中指针变量的作用 通过指针变量访问该指针变量指向的单元 指针变量的值不变 指针变量的定义的一般格式为 类型标识符 指针变量名例如 int p float q 指针变量的引用 必须先定义 后使用指针变量定义后 可以对其进行如下操作 赋值 引用指针变量的值 访问指针变量指向的变量等 如上例中通过p1 p2访问变量a b对应的单元 其中p1表示指针变量 p1表示p1指向的变量 即变量a p1表示指针变量p1所在单元的地址 回顾例10 2 通过指针变量p1 p2交换了变量a和b的值 那么 为什么要用指针变量而不直接用变量名呢 再回顾函数一章的例8 4 编写函数swap 交换两个变量的值 函数如下 viodswap inta intb intt t a a b b t main intx 5 y 6 swap x y printf nx d y d x y 结果 x 5 y 6程序并未实现交换x y的值 why 因为参数传递是单向的 对形参的改变不影响实参的值 指针变量作函数参数 解决以上问题的方法是 指向变量的指针变量作函数形参 接收主调函数中实参变量的地址 实现传地址调用 即在被调函数中通过指针变量访问 读取或修改 主调函数中对应的变量 当返回主调函数后 主调函数就得到了这些已修改过的变量的值 因此 传地址 调用可以实现函数间多个数据的 双向传递 main 编写函数交换两个变量的值 inta b voidswap int p int q printf ninput2integers scanf d d 调用过程中参数的对应关系 Main swap apbq p a q b因此 在swap函数中通过指针变量p q就可以访问main函数中的变量a b了 由此可以实现函数之间的多个 数据传递 a b 10 2指针与数组 通过指针访问数组元素10 2 1指针与一维数组inta 6 pa k a a 0 a 1 a 5 Afterexecute pa a a 0 a 1 a 5 a papa 1pa 2 例10 5分别用下标法和指针法访问一维数组 程序 1 下标法main inta 5 1 2 3 5 7 i for i 0 i 5 i printf 4d a i 程序 2 指针法main inta 5 1 2 3 5 7 p for p a p a 5 p printf 5d p 程序 3 地址法 指针常量 main inta 5 1 2 3 5 7 i for i 0 i 5 i printf 5d a i 指针运算 除赋值 取地址则解释以下表达式的含义 p p 1 p p p q 例10 3利用指针求字符串的长度 分析 设字符串用一维字符数组str保存 算法 s1 首先让指针变量p指向字符串的首地址 s2 重复判断指针变量所指的字符 p 是否等于字符串结束标志 0 若不等 则指针p指向下一个字符 S3 两个指针相减 p str 即字符串的长度 其中 s2用循环结构实现 str是数组名 代表数组的首地址 相当于指针常量 例10 3程序 strmain charstr you 运行结果 string length 8P 的含义 p指向下一个数组元素 思考 p 2呢 P str的含义 p和str之间数据的个数 只有都指向同一数组时使用 程序中不能直接使用str 因为str不是指针变量 而是指针常量 y o u m e 0 或者用单独一个函数len 实现 intlen char str intn 0 while srt 0 n returnn main chars 80 saleapples intm m len s printf nlenth 6d m 分析参数传递过程 s str 例10 6编写函数实现 将数组中的n个整数逆序存放 调用该函数实现将10个整数逆序存放 main inta 10 1 2 4 6 8 9 7 5 3 10 i int p voidinv int q intn 函数声明 printf nbeforeinverse n for p a p a 10 p printf 5d p 用指针访问数组元素 inv a 10 printf nafterinverse n for i 0 i 10 i printf 5d a i 用下标访问 voidinv int q intn 函数inv 实现逆序 int i j t for i q j q n 1 i j i j t i i j j t return 3 调用函数inv 时 实参与形参的对应关系 实参 a10形参 qn结果 指针变量q接收数组a的首地址 即q指向数组a的第一个数组元素 因此 在函数inv 中通过指针变量i j改变的是数组a的元素 函数inv 与下面的函数inver 功能等价 voidinver intb intn inti j t for i 0 j n 1 i j i j t b i b i b j b j t return 说明 形参数组名与指针变量等价 此处用b接收a的首地址 实现通过数组名b访问数组a 指针法与下标法访问数组的区别 用指针速度快 10 2 2指针与二维数组 1 可以将二维数组看作一个一维数组进行访问 通过指向数组元素的指针访问各元素 例10 8利用指针变量输出整型二维数组ss中的各元素 main intss 2 3 2 4 6 8 10 12 int p printf n for p ss 0 p ss 0 6 p p ss 0 与p 说明 因为p是指向整型数据的指针变量 因此初值应为第一个数组元素的地址 p 使得p指向下一个数组元素 图示 p 24681012 S 0 0 S 0 1 S 0 2 S 1 0 S 1 1 S 1 2 2 利用指向一维数组的指针变量访问二维数组 例10 9利用指向一维数组的指针变量p输出数组ss 2 4 中的各元素 main intss 2 4 2 4 6 8 10 12 14 16 int p 4 j printf n for p ss p ss 2 p for j 0 j 4 j printf 6d p j equalto p j 说明 p是指向一个包含有4个元素的一维数组的指针变量 因此 p 的含义是 使p指向下一个一维数组 即移动4个元素的位置 与例10 8中的p 比较 p j 的含义 p所指向的一维数组中下标为j的元素 等价于 p j 通过以上两例比较 可以看出两种指针变量的使用区别 指向数组元素的指针变量可以访问任意长度的数组 指向一维数组的指针变量只能访问固定长度的数组 应用 当需用指针变量作为函数参数 编写处理任意二维数组的数据时 用方法1更合适 例10 10编写函数实现 求m n矩阵中最大值元素的下标 并编写主函数调用之 在主函数中输出结果 较高要求的练习 分析 设函数名为max 类型为void 参数有5个 分别表示数组元素的首地址 行列数m n 最大值元素的行列下标地址r c 算法 略 main intss 4 3 1 12 3 14 5 16 7 8 9 2 13 4 intmax r max c voidmax max ss 0 4 3 p i n j 表示数组元素ss i j 的地址思考 1 若用二维数组名作函数参数 是否能实现 2 如何用函数实现 计算任意班级 n个人m门课 每门课的平均成绩 10 2 3指针与字符串 字符串用字符数组来保存 可以通过数组名及下标访问 也可以通过字符指针访问 例10 11 输入任意字符串 通过字符数组名和字符指针输出该字符串 includemain charstring 80 str gets string stringistheaddressofstring 0 puts string str string strpointtothecharacterarray puts str 例10 12用字符数组与字符指针分别访问一字符串常量 includemain charstring youarereallyfine str thankyou puts string puts str 运行结果 youarereallyfine thankyou 分析 字符数组名与字符指针变量的使用区别 str thankyou 等价于char str str thankyou 而charstring youarereallyfine 不等价于charstring 80 string youarereallyfine 若定义 chars1 80 s2 则语句 gets s1 是正确的但语句 gets s2 不完全正确 因为s2未赋值就使用 这样可能使系统程序或其他数据区受到破坏 字符指针变量作函数参数 等同于字符数组名作函数参数 实现传地址调用 便于多个函数之间的字符串的传递 例10 14用函数实现取子字符串 从字符串s1中第m个字符开始的全部字符复制到另一字符串 includemain chars1 80 s2 80 intn voidcopy str char p char q intm gets s1 scanf d voidcopy str char p char q intm p p m 1 while p 0 q p p q q 0 思考 若用字符数组作函数参数 如何实现 分析参数传递的过程 有何区别 结论 形参数组名相当于指针变量 10 3指针与函数 指针变量作函数参数 如果形参是指针变量 实参可以是变量的地址 数组元素的地址 或数组名 函数的首地址 本节主要介绍 指向函数的指针的使用返回值指针值的函数 主要用于处理多个字符串 重点 编写返回指针的函数 指向函数的指针 函数的指针 即函数名 表示函数的首地址 例10 15指向函数的指针变量的定义 引用 include math h main doublex p y 注意定义与引用中的 的区别 x 3 14 2 p sin y p x printf nsin 3 1f y p cos y p x printf ncos 3 1f y 指向函数的指针变量的一般定义形式为 类型标识符 指针变量名 参数类型 例如 int da 定义指针变量da 它指向一个返回int型值的函数 应用 利用指向函数的指针变量编写通用函数 较高要求 例10 16编写函数 求任意函数f x 在区间 a b 上的定积分 程序 略 返回指针值的函数 一个函数的返回值可以是int float double character型等 也可以返回其他类型的值 比如指针类型 例如 char strcpy char a char b char strcat char s1 char s2 char strchr char s charch 例10 17编写函数search 查找字符ch在字符串str中第一次出现的位置 在主函数中输入字符串 待查找的字符 输出查找结果 分析 函数search 的类型为指向字符数据的指针类型 参数有两个 字符型的ch和指向字符的指针变量str 算法 从str指向的字符串的首字符开始 循环比较str指向的字符是否与字符ch相等 若相等 则结束循环 返回指向该字符的指针 否则 str指向下一个字符 直到字符串结束标志 0 为止 返回空指针 NULL 表示没找到 include stdio h 程序 例10 17 main char search char str charch charss 80 p chr printf ninputastring gets ss printf ninputacharforsearch chr getchar p search ss chr if p NULL printf nnotfound elseprintf nposition d countfrom0 p ss char search char str charch 注意 函数名前的 while str 0 表示该函数的返回值为指针 if str ch return str elsestr return NULL 返回指针值的函数的一般定义格式 类型标识符 函数名 形参表 与其他函数的不同 函数名前有 表示指针类型 类型标识符说明该指针指向的数据的类型 例10 18编写两个字符串连接的函数 返回连接后的字符串的首地址 分析 函数类型为返回指向字符型的指针 参数两个 均为字符数组或字符型指针变量 首先找到字符串str1的末尾 然后将字符串str2的字符逐个送入str1 最后在str1的末尾加字符串结束标记 0 include stdio h char my strcat char str1 char str2 char p str1 while p 0 p findtheendofstr1 while str2 0 p str2 p 0 return str1 main chars1 80 weare s2 goodfriends p puts s1 puts s2 p my strcat s1 s2 puts p p str2 的功能是 将str2指向的字符赋给p指向的单元 字符串str1中的指定位置 然后p和str均指向下一个字符 该语句等价于 p str2 p str2 再比如 字符串复制 char strcopy char s char t char p s while t 0 s t s t s 0 returnp 上面红色的语句等价于 while s t 0 10 4指针数组和指向指针的指针 指针数组指向指针的指针命令行参数要求 熟悉 10 4 1指针数组 指针数组实际上是指向相同类型数据的指针变量的集合 每个数组元素相当于一个指针变量 指针数组的应用 1 用于访问由多个字符串组成的二维字符数组 优点是 节省内存 加快排序速度 2 指针数组作main函数的形参 例10 19用指针数组指向给定的5个字符串 然后逐个输出 分析 5个字符串的首地址分别存放于指针数组的一个元素中 因为要处理给定的字符串 所以在程序中直接给出 而不是用户输入 程序 l10 4 1 c 下页 include L10 4 1 c main char str basic turboc fortran vc java inti for i 0 i 5 i puts str i 程序中指针数组的初始化等价于 char str 5 string 10 basic turboc fortran vc java for i 0 i 5 i str i string i 图示二者区别 用指针数组更节省内存 注意 指针数组与指向数组的指针变量的区别 区分char str 5 与char p 5 例10 20用指针数组实现字符串排序 速度更快 分析 一初始化方式存入5个名字 排序 输出 其中 10个名字用字符型指针数组保存 每个元素保存一个名字的首地址 排序时 只交换指向字符串的指针 而不需交换两个字符串 输出时 按指针数组的元素顺序即是排序后的字符串的顺序 includemain voidsort prn char str basic turboc fortran vc java sort str 5 prn str 5 voidsort char v intm 用选择法排序 inti j k char t for i 0 i0 k j if k i t v k v k v i v i t 交换 voidprn char v intm inti for i 0 i m i puts v i 运行结果 basicfortranjavaturbocvc 例10 4 3指针数组作main函数的参数 实现向程序传送命令行参数 如编程实现文件复制 copyfile1namefile2nameCR 详见文件一章 下面程序 l10 4 3 c 实现 输出命令行参数 main intargc char argv intj for j 1 j argc j printf n s argv j 运行时输入 l10 4 3f1 datf2 dat 则输出 f1 datf2 dat 命令行 l10 4 3f1 datf2 datargv l10 4 3 0 f1 dat 0 f2 dat 0 下面程序与上例等价 main intargc char argv while argc 1 argv printf n s argv argc 本例中 char argv 与char argv等价 其中 argc为参数个数 argv为指针数组 每个数组元素指向一个字符串 即argv 0 指向第一个字符串 l10 4 3 argv 1 指向第二个字符串 f1 dat argv 2 指向第三个字符串 f2 dat 10 4 2指向指针的指针 即指向指针数据的指针变量 如inta p q ap 则q为指向指针的指针变量 p pequaltoa qequaltopq qequaltoa应用 用于访问指针数组 了解 练习 1 编写函数max min 求一批实型数据中的最大和最小值 编写主函数调用之 并在主函数中输入n个数据 输出最大及最小值 练习用指针变量作函数参数 在函数之间传递多个数据 2 以下程序的功能是输出数组中的最大元素值 填空 includeMain inta 1 7 9 4 3 5 6 10 2 8 int m p for p a m a p a 10 p if m p printf n d m 3 includemain inta 1 2 3 4 5 6 intx f a 4 printf d x intf intx intn intI s 1 for I 0 I n I s x I returns 运行结果是 120 4 main intj intm 3 2 10 20 30 40 50 60 for j 0 j 2 j printf d m 2 j j 运行结果 50 40 5 main intx 30 y 40 int px 运行结果 x 33 y 30 作业 1 上机练习第二部分2 习题3 13 23 53 6
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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