《处理动态数据》PPT课件.ppt

上传人:tia****nde 文档编号:11505039 上传时间:2020-04-26 格式:PPT 页数:30 大小:459.50KB
返回 下载 相关 举报
《处理动态数据》PPT课件.ppt_第1页
第1页 / 共30页
《处理动态数据》PPT课件.ppt_第2页
第2页 / 共30页
《处理动态数据》PPT课件.ppt_第3页
第3页 / 共30页
点击查看更多>>
资源描述
第七章处理复杂数据,主要内容,案例:处理“学生信息管理系统”的人数变动使用指针处理表示学生人数变动案例实施学生练习拓展小结,用数组来存储多位学生的信息。由于在C语言中数组只能定义定长的,而在实际中无法事先知道学生的人数,从而无法确定数组的大小。所以当学生人数变动的时候,使用数组就有点不方便了:因为如果将数组定义过长,浪费空间;定义太短,又不够用。现在在这里引入一个C语言中重要的概念-指针。通过使用指针,就可以很方便的实现学生人数的变动,根据实际情况来申请存储空间。从而不会出现存储空间的浪费或不够用问题。在本章,将继续完善“学生信息管理系统”案例程序。在上一章案例程序的基础上,可以实现对学生人数的变化进行存储空间的动态分配管理。具体是临时确定学生人数,进行存储空间的动态分配,处理“学生信息管理系统”人数变动,如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。系统根据程序中定义变量的类型,分配特定长度的空间。内存区的每一个字节都有一个编号,这就是“地址”。它就相当于旅馆中的房间号或是学生宿舍的宿舍号一样。在地址所标志的内存单元中存放数据,就相当于旅馆中各个房间中住旅客一样。根据内存编号也可以准确地找到所需要的内存单元。所以内存单元的地址与内存单元的内容是两个不同的概念。,使用指针处理人数变动-指针,使用指针处理人数变动-指针,定义了一个int型变量x,编译时系统分配了2000到2003四个字节给变量x。定义了一个float型变量y,编译时分配了3000到3003四个字节给变量y。通常我们只关心变量的第一个字节的编号。将变量的第一个字节编号称该变量的地址。2000是变量x的地址,3000是变量y的地址。把一个变量的地址称为该变量的“指针”。严格地说,一个指针就是一个地址。,有了指针的定义,就可以来了解一下变量的值的读取操作。在程序中一般是通过变量名来对内存单元进行存取操作的。如printf(“%d”,x)的执行是这样的:根据变量名与地址的对应关系(这个关系是在编译时确定的),找到变量x的地址2000,然后从由2000开始的四个字节中取出数据,把它输出。这种按变量地址存取变量值的方式称“直接访问”方式另外还可以采用一种称为“间接访问”的方式,将变量x的地址存放在另外一个变量中。C语言中可以定义这样的一种特殊变量,它存放变量的地址。假设定义了一个变量x_pointer,用来存放整型变量x的地址,可以通过下列语句将x变量的地址2000存放到变量x_pointer中:x_pointer=这时,x_pointer中的值就是2000,即变量x所占用单元的起始地址。要变量x的值时,也就可以通过间接方式:先找到存放变量x地址的变量,从中取到x的地址(2000),然后到2000到2003字节中取出变量x的值。,使用指针处理人数变动-指针,2000,X_pointer:(3012-3015),X_value,X:(2000-2003),X_value,X:(2000-2003),一个变量的地址称为该变量的“指针”。如果用一个变量专门来存放另外一个变量的地址(即指针),则它就称为“指针变量”。也可以说存放变量地址的变量是指针变量。定义一个指针变量必须包括3个内容:(1)指针类型说明,即定义变量为一个指针变量;(2)指针变量名;(3)指针变量所指向的变量的数据类型。其一般定义形式为:基类型*指针变量名;其中*表示这是一个指针变量,基类型表示指针变量指向的变量的数据类型。基类型必须指定,一个指针变量只能指向同一个类型的变量,指针处理人数变动-指针变量的定义,int*p1;float*p2;Student*stu;,当定义了一个指针变量之后,和其他变量一样,就应该给它赋值。没有赋值的指针变量不能使用。指针变量的赋值只能是赋予地址,绝对不能赋予其他数据,也就是让它指向它定义的那个基类型的一个变量。指针变量的两个运算符(1)shortint*i_pointer;i_pointer=这样定义的指针变量i_pointer就指向变量i。假设定义变量i的时候,它分配的空间的首地址为2000。当运行i_pointer=/年intmonth;/月intday;/日Date;typedefstructcharname40;/学生姓名charsno20;/学号charsid20;/身份证号码Datebirth;/出生日期charaddress200;/家庭地址Student;,指针处理人数变动-结构类型指针,Studentstu=张三,2010060501,410203199010123045,1990,10,12,广东省广州市天河区天河北路123号;Student*stup;stup=可以把这个指针变量赋值,使得指针变量stup指向该结构体变量stu。,指针处理人数变动-结构类型指针,访问结构体变量成员的一般形式是:结构变量名.成员名printf(学生基本信息:n姓名=%sn学号=%sn身份证=%sn出生日期=%d-%d-%dn家庭地址=%sn,stu.name,stu.sno,stu.sid,stu.birth.year,stu.birth.month,stu.birth.day,stu.address);也可以用指针变量来访问该结构体变量的各个成员,访问结构变量成员的一般形式是:(*指针变量名).成员名或指针变量名-成员名printf(学生基本信息:n姓名=%sn学号=%sn身份证=%sn出生日期=%d-%d-%dn家庭地址=%sn,(*stup).name,(*stup).sno,(*stup).sid,(*stup).birth.year,(*stup).birth.month,(*stup).birth.day,(*stup).address);printf(学生基本信息:n姓名=%sn学号=%sn身份证=%sn出生日期=%d-%d-%dn家庭地址=%sn,stup-name,stup-sno,stup-sid,stup-birth.year,stup-birth.month,stup-birth.day,stup-address);,指针处理人数变动-结构类型指针,可利用指向结构体数组的指针变量来读取结构体中第一个元素的内容。Studentstu50,*stup=,指针处理人数变动-结构类型指针,#includevoidswap(intx,inty)inttemp;temp=x;x=y;y=temp;main()inta,b;scanf(%d,%d,指针处理人数变动-指针作为参数,#includevoidswap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;main()inta,b;int*pointer_1,*pointer_2;scanf(%d,%d,指针处理人数变动-指针作为参数,#includevoidswap(int*p1,int*p2)intp;p=*p1;*p1=*p2;*p2=p;main()inta,b;int*pointer_1,*pointer_2;scanf(%d,%d,指针处理人数变动-指针作为参数,malloc函数函数的原型为:void*malloc(unsignedintsize);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数返回一个指向分配域起始地址的指针。如果该函数没有能成功执行,如内存空间不足,则返回一个空指针。下列语句申请一个前面定义的结构体所占空间,即292个字节大小。同时将申请空间的首地址赋给一个结构体类型的指针变量。Student*stup;stup=(Student*)malloc(sizeof(Student);其中的(Student*)称为强制转换:因为malloc函数的返回值是指向void的指针,如果我们将这个返回值直接赋给stup指针变量,会出现编译错误。而进行这个强制转换,就是为了告诉编译器:我们知道这个类型不匹配问题,但是没关系,请不要把它当做错误对待。,指针处理人数变动-malloc函数申请空间,Free函数的函数原型为:voidfree(void*p)其作用是释放由p指向的内存区,从而使得这部分内存区能被其他变量使用。该函数没有返回值。如上面申请了空间。然后可以释放该空间:free(stup);有了存储空间的分配和释放库函数,在案例程序“学生信息管理系统”中就可以根据实际情况进行存储空间的动态分配。首先确定要保存的学生信息数量,然后就可以动态分配空间了。printf(请输入要录入的学生总数:);scanf(%d,指针处理人数变动-free函数释放空间,Studentstu50改为Student*stu加上#include修改insert()函数,案例实施-用指针处理学生人数变动,intinsert()while(total=total)printf(对不起,由于人数已满,不能再添加新学生信息n);return1;printf(请输入学生姓名:);scanf(%s,stucurrent.name);printf(请输入学生学号:);scanf(%s,stucurrent.sno);printf(请输入学生身份证号码:);scanf(%s,stucurrent.sid);printf(请输入学生出生日期,格式(年-月-日):);scanf(%d-%d-%d,案例实施-用指针处理学生人数变动,处理“图书信息管理系统”的动态图书数据至此,已经完成对存储学生信息的存储空间动态分配。现在到了你管理图书信息存储空间动态分配的时候了。继续完善你的案例程序,使之可以对图书信息存储空间的动态分配。具体要求:(1)编写能管理图书存储空间动态分配的案例程序;(2)在codeBlocks环境下调试你的程序,使之正确运行。,学生练习,首先定义一个简单类型的数组和一个指针变量,同时使指针变量指向该数组。inta6;int*p;p=a;C语言规定数组名代表数组的首地址,也就是第1个元素的地址,同时它是常量。所以下面的两个语句等价:p=现在虽然a和p都是表示数组中第一个元素的地址。但是他们是有区别的,a是指针常量,p是指针变量。可以有语句p+或p-,但是不能有a+和a-。现在可以通过指针来引用数组元素了。,拓展指向一维数组的指针变量,main()inta6,i;int*p;p=a;for(i=0;i6;i+)*(p+i)=i;for(i=0;i6;i+)printf(a%d=%dn,i,*(p+i);,1、p+i和a+i就是ai的地址,或说他们都是指向a数组的第i+1个元素。2、*(p+i)和*(a+i)就是p+i和a+i所指向的数组元素,即ai,拓展指向一维数组的指针变量,main()inta6,i;for(i=0;i6;i+)ai=i;for(i=0;i6;i+)printf(a%d=%dn,i,ai);,拓展指向一维数组的指针变量,main()inta6,i;for(i=0;i6;i+)*(a+i)=i;for(i=0;i6;i+)printf(a%d=%dn,i,*(a+i);,main()inta6,i;int*p;p=a;for(i=0;i6;i+)*(p+i)=i;for(i=0;i6;i+)printf(a%d=%dn,i,*(p+i);,定义二维数组:shortinta34;假设数组a的首地址为2000,一个短整形数据在存储空间中占2个字节,并且是以行优先进行存储。则该数组的各个元素的首地址和值如图,拓展指向二维数组的指针变量,(1)a是数组名,它包含三个元素a0、a1、a2,每个元素ai又是一个一维数组,包含4个元素。(2)a是二维数组的首地址,即第0行的首地址;a+i是第i行的首地址。(3)ai*(a+i),都是第i行第0列的元素地址(4)ai+j*(a+i)+j,都是第i行第j列的元素地址(5)*(ai+j)*(*(a+i)+j)aij(6)a+i=它表示p是一个指针变量,指向包含4个元素的一维数组。其中一维数组指针变量维数一定和二维数组列数相等。,拓展指向二维数组的指针变量,链表是一种常见的重要的数据结构。它是动态地进行存储空间分配的一种结构。我们知道,用数组存储数据时,必须事先定义固定的长度(即元素个数)。这样我们很难把握数组的长度,从而造成空间的浪费或不足。结点:单向链表中每个元素称为一个“结点”,一个结点包括两个部分:一个数据域,是用来存储用户要用的实际数据;一个指针域,用来存储它下一个结点的地址。多个结点通过指针域连接起来就成了一个链表。head指向第一个元素,称为“头指针”;第一个元素又指向第二个元素直到最后一个元素,该元素不再指向其他元素,它称为“表尾”,它的地址部分放一个“NULL”,表示空地址,链表到这里结束。,拓展指针处理链表,链表的定义:structlinknodechardata;structlinknode*next;,拓展指针处理链表,本章介绍了C语言程序设计中的指针的基本概念和初步应用。并应用指针完善了案例程序“学生信息管理系统”的设计,通过使用指针实现了学生信息存储空间的动态分配管理。最后还简单的介绍了一下二级指针的概念和应用以及用指针处理链表。,小结,
展开阅读全文
相关资源
相关搜索

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


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

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


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