《C语言程序设计》课件-8.指针与文件综合实战_第1页
《C语言程序设计》课件-8.指针与文件综合实战_第2页
《C语言程序设计》课件-8.指针与文件综合实战_第3页
《C语言程序设计》课件-8.指针与文件综合实战_第4页
《C语言程序设计》课件-8.指针与文件综合实战_第5页
已阅读5页,还剩67页未读, 继续免费阅读

下载本文档

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

文档简介

按大小顺序输出数值——指针和指针变量——目录CONTENTS01指针和指针变量的概念02指针变量的定义与引用03指针变量的运算04案例:按大小顺序输出数值指针和指针变量上节回顾完成了C语言基础语法与简单程序逻辑的学习。本讲内容学习指针和指针变量的相关知识,结合案例讲解如何用指针实现数值排序输出。课程导入1掌握指针变量的定义。2学会指针变量的引用与操作。3理解指针变量的运算。4运用指针完成数值排序的案例实操。指针和指针变量课程目标01指针和指针变量的概念内存与地址定义变量时,系统会为变量分配对应的内存空间。内存里每一个字节都有一个唯一的编号,这个编号就是地址。类比:地址就像生活中的门牌号——通过门牌号能找到对应的住户,通过内存地址就能精准找到对应的变量存储空间。指针和指针变量01指针和指针变量:内存与地址指针变量在内存中的地址,称为这个变量的指针。指针是一个具体的数值,不是抽象的概念。指针变量专门用来存放其他变量地址的变量。核心作用是“指向”另一个变量。区分要点:指针是存储空间的首地址(变量的地址);指针变量是专门存放这个地址的变量。两个概念容易混淆,一定要区分清楚。指针和指针变量01指针与指针变量的概念02指针变量的定义与引用类型名*指针变量名;int*pa;//指向整型变量的指针变量char*pb;//指向字符型变量的指针变量定义要点星号*是指针变量的标识,告诉编译器这是一个指针变量。注意:指针变量的类型必须和它指向的变量类型保持一致。指针和指针变量02指针变量的定义&取地址运算符获取变量的内存地址。*取值运算符又称“间接访问”运算符,取指向变量的值。指针变量的三种引用方式:1给指针变量赋值:p=&a;把a的地址赋给p,p指向a。2引用指针变量指向的变量:前提是已执行p=&a;让指针有明确的指向。3引用指向变量的值:printf("%d",*p);把对应的值打印到控制台。指针和指针变量02核心运算符与引用方式03指针变量的运算指针变量的运算主要包括赋值运算、算术运算和关系运算三种。先看赋值运算。赋值运算通过赋值表达式,将同类型的变量地址赋给指针。intk,*r,*s=&k;//s直接指向kr=s;//r与s同时指向k关键:赋值的指针类型必须和被赋值的指针类型一致,否则会出现编译错误。指针和指针变量03指针变量的运算:赋值运算算术运算:++与--主要是增、减量运算,通常用于指向数组元素的指针变量。增/减量的单位是1,但实际字节数由指向的变量类型决定。示例:整型指针+1实际跳过4个字节;字符型指针+1只跳过1个字节。指针和指针变量03指针变量的运算:算术运算关系运算指针和普通变量一样,可以进行大于、小于、等于等关系运算。两个指针指向同一个数组时,关系运算能表明所指元素的位置关系。示例:p1>p2说明p1指向的数组元素在p2指向的元素后面。指针和指针变量03指针变量的运算:关系运算04案例:按大小顺序输出数值案例核心要求①用指针方法处理数值排序问题。②不交换整型变量本身的值,通过交换两个指针变量的值实现排序。核心问题输入a和b两个整数,使用指针按由大到小的顺序输出a和b。指针和指针变量04案例:数值排序任务分析假设输入a是5,b是9,核心原理如下:①初始指向p1=&a,p2=&b:p1指向a,p2指向b。②判断大小程序判断出a的值小于b的值。③交换指向p1转而指向b,p2转而指向a。结果a、b的值未交换仍保持原值;输出*p1、*p2实际是b和a的值,先输出9再输出5,实现由大到小排序。指针和指针变量04案例原理:交换指针指向请输入两个整数:5629a=56,b=29max=56,min=29Processexitedwithreturnvalue0结果解读•a=56,b=29:变量值没有变化。•通过交换指针指向,输出max=56,min=29。•返回值0,程序正常结束。指针和指针变量04代码运行结果第一阶段:初始状态输入a=45,b=78;p1指向a,存&a;p2指向b,存&b。第二阶段:交换指向判断大小后执行指针交换:p1转而指向b,p2转而指向a。第三阶段:数据未动a、b的值在内存中始终不变,只改变访问数据的视角,实现大小顺序输出。指针和指针变量04指针交换的奥秘作用域局部变量作用于函数或代码块内部;全局变量作用于整个程序。存储类别auto随函数调用生灭;static常驻内存,有“记忆”功能。核心编程原则优先使用局部变量降低耦合;合理利用全局与static变量解决特定问题。核心概念指针是变量的内存地址;指针变量存储的是另一个变量的内存地址。关键操作符*定义指针并间接访问指向的值;&获取变量地址并赋给指针。进阶技巧交换指针指向可改变数据访问顺序,无需交换数据本身,节省内存拷贝开销。指针和指针变量课程总结谢谢大家数组逆序输出——指针与数组的等价关系——主讲人:冯淑婷目录CONTENTS01指向一维数组的指针02数组与指针的等价关系03指向二维数组、字符串的指针04案例:完整代码数组逆序输出上节回顾学习了指针和指针变量的基础概念、操作运算,通过交换指针指向实现了两个数值的排序输出。本讲内容深入学习指针与数组的结合应用,重点掌握指针实现数组逆序输出,特别是指针与数组的等价关系。课程导入1掌握指向一维数组的指针,理解数组名与地址的关系。2了解指向二维数组的指针基本概念。3认识指向字符串数组的指针。4完成核心案例:用指针实现数组逆序输出。数组逆序输出课程目标01指向一维数组的指针数组在内存中是连续存储空间如inta[5],a[0]到a[4]在内存中紧密排列。a[0]首地址a[1]地址1a[2]地址2a[3]地址3a[4]地址4数组元素在内存中一个接一个,地址连续。数组逆序输出01指向一维数组的指针:连续存储数组名的本质数组名a不是普通名字,它是首元素a[0]的地址。它是常量指针,不能被赋值修改。数组名=数组首地址简单记:数组名=数组首地址。数组逆序输出01数组名的本质:首地址02数组与指针的等价关系下标法a[i]最直观,我们最常用。数组名地址法*(a+i)a是首地址,a+i偏移,*取值。指针变量法*(p+i)p指向数组首地址,用法和a一样。核心结论:a[i]、*(a+i)、*(p+i)

完全等价,可以随便互换。数组逆序输出02数组与指针的等价关系03指向二维数组、字符串的指针指向二维数组的指针•二维数组可以看成“数组的数组”。•二维数组名是首行地址。•指向二维数组的指针,需要匹配数组的行结构。本节课重点在一维数组,二维部分后续深入讲解。数组逆序输出03指向二维数组的指针指向字符串数组的指针•字符串数组本质是字符指针数组。•每个元素是一个字符串首地址。•用指针可以方便遍历、输出字符串。整数数组逆序,字符串指针先做概念了解。数组逆序输出04指向字符串数组的指针04案例:完整代码核心案例:数组逆序输出,先看完整代码。#include<stdio.h>int

main(){

inta[10],*p,i;

//输入10个整数

printf("请输入10个整数:\n");

for(i=0;i<10;i++){

scanf("%d",&a[i]);}

//正序输出

printf("\n数组的原始顺序是:");

for(p=a;p<a+10;p++){

if(p!=a)printf("");

printf("%d",*p);}

//逆序输出

printf("\n数组的逆序输出是:");

for(p=a+9;p>=a;p--){

if(p!=a+9)printf("");

printf("%d",*p);}

printf("\n");

return

0;}数组逆序输出05案例:完整代码正序输出(指针向后走)•初始化:p=a,指向a[0]。•条件:p<a+10,不越界。•移动:p++,每次向后跳一个元素。指针从数组首元素出发,逐个向后访问,直到末尾。数组逆序输出06代码解析:正序原理逆序输出(指针向前走)•初始化:p=a+9,指向最后一个元素a[9]。•条件:p>=a,不走到数组前面。•移动:p--,每次向前跳一个元素。用判断避免末尾多余空格,输出更整齐。数组逆序输出06代码解析:逆序原理1数组名本质:数组名a是首地址,是常量,不能修改。2访问等价:a[i]、*(a+i)、*(p+i)完全一样。3指针遍历:用p++正序、p--逆序,代码更简洁高效。数组逆序输出课程总结谢谢大家函数顺序输出——指针作为函数参数——主讲人:冯淑婷目录CONTENTS01函数参数(值传递)的局限02指针参数“地址传递”原理03案例:指针实现数据回传指针作为函数参数上节回顾学习了指针与一维数组的结合应用,掌握了用指针遍历数组、实现数组逆序输出的方法,理解了数组名与指针的等价特性。本讲内容学习指针在函数中的应用,重点掌握指针作为函数参数的使用方法,解决核心问题:函数怎么一次性返回多个数据。课程导入1理解函数值传递的局限性,知道为什么普通参数不能回传多个数据。2掌握指针参数地址传递的原理,明白地址传递和值传递的本质区别。3通过完整案例,学会用指针实现数据回传,并能顺序输出结果。指针作为函数参数课程目标01函数参数(值传递)的局限思考:函数如何返还多个数据?平时写函数,用return只能返回一个值。比如想同时返回学生语文、数学、英语三科成绩,return就做不到了。单一返回值的局限:一个return无法同时带回多个结果。指针作为函数参数01函数参数(值传递)的局限核心是值传递主函数的变量a传给形参x时,系统会复制一份a的值给x。a和x是两块独立内存,函数里改x,主函数里的a完全不变。主函数a形参x(副本)复制值简单说:值传递传的是副本,改副本不影响原件,所以没法把数据回传给主函数。指针作为函数参数01为什么普通参数不行02指针参数“地址传递”原理指针参数:地址传递•传的是变量地址,不是变量值。比如把&a传给指针形参*p,p就存了a的内存位置。•用*p可以间接访问原变量,直接修改主函数里的变量数据。总结:地址传递让函数直接操作主函数的内存,不用复制副本,能真正修改原变量。指针作为函数参数02指针参数“地址传递”原理地址传递的内存指向关系:num1(主函数)p1(存&num1)p1指向num1num2(主函数)p2(存&num2)p2指向num2指针形参存的是主函数变量的地址,函数通过*p1、*p2直接读写主函数的内存。指针作为函数参数02地址传递图示03案例:指针实现数据回传案例:让函数接收用户输入,把数据回传给主函数,再顺序输出。#include<stdio.h>void

getData(int*p1,int*p2){

printf("请输入两个整数:");

scanf("%d%d",p1,p2);}int

main(){

intnum1,num2;

getData(&num1,&num2);

printf("结果:%d,%d\n",num1,num2);

return

0;}结构速览•getData的形参是指针p1、p2。•scanf直接用p1、p2,本身就是地址。•main传&num1、&num2调用。•无需return,主函数直接输出结果。指针作为函数参数03案例:指针实现数据回传①主函数传递地址调用getData(&num1,&num2),把num1、num2的地址传给p1、p2,p1指向num1,p2指向num2。②函数内直接写入内存scanf("%d%d",p1,p2):p1、p2本身就是地址,输入的值直接存到num1、num2的内存里。③回传成功函数结束后num1、num2已经被赋值,主函数直接顺序输出即可。指针作为函数参数03代码解析:数据如何“回传”对比项普通参数(值传递)指针参数(地址传递)传递内容变量副本变量地址修改效果函数内修改不影响原变量可直接修改主函数变量适用场景只使用数据,不需要回传需返回多个数据,实现回传指针作为函数参数04课程总结:两种方式对比核心应用场景函数需要返回多个结果时,指针是C语言最常用、最核心的解决方案。指针作为函数参数04核心应用场景谢谢大家综合实战——入学信息统计与文件读写——主讲人:冯淑婷目录CONTENTS01数据持久化存储02关键知识点与核心逻辑03数据写入文本文件04读取文本文件数据入学信息统计与文件读写上节回顾学习指针作为函数参数的应用,通过地址传递实现函数数据回传,解决函数无法返回多个数据的问题。本讲内容综合实战:把结构体、数组和文件操作结合起来,实现数据持久化存储。课程导入1理解什么是数据持久化,解决程序关闭数据就丢失的问题。2掌握把结构体数组数据写入文本文件的方法。3学会把文本文件里的数据读回到结构体数组中。入学信息统计与文件读写课程目标01数据持久化存储问题回顾:内存数据是易失的用结构体数组存了5名学生的入学信息,但内存里的数据是易失的。程序一关闭、电脑一重启,数据就没了,下次用必须重新输入,麻烦且效率低。入学信息统计与文件读写01数据持久化存储:问题回顾解决方案:文件持久化存储把文件想象成一个“笔记本”:程序运行时数据在内存,关闭前写到文件里,就像记在本子上,永久保存。下次打开程序,直接从文件读回来,不用重复输入。入学信息统计与文件读写01数据持久化存储:解决方案02关键知识点与核心逻辑结构体数组在内存里批量存放学生的姓名、成绩等信息,是数据载体。文件格式化读写用fprintf和fscanf和硬盘文件交互,用法和printf/scanf很像,只是多了文件指针。核心桥梁fprintf/fscanf是连接内存和硬盘的桥梁,让数据能存进去、读出来,形成完整闭环。入学信息统计与文件读写02数据存储三个关键知识点整个数据持久化只有两步,而且逻辑对称:结构体数组(内存)文本文件(硬盘)①写盘:for循环+fprintf②读盘:循环fscanf+存回数组重难点:读写的格式控制符必须完全一样,不然数据会乱码、读错位。入学信息统计与

温馨提示

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

评论

0/150

提交评论