软件技术基础之指针和结构体课件.ppt

上传人:sccc 文档编号:5642528 上传时间:2023-08-05 格式:PPT 页数:50 大小:2.55MB
返回 下载 相关 举报
软件技术基础之指针和结构体课件.ppt_第1页
第1页 / 共50页
软件技术基础之指针和结构体课件.ppt_第2页
第2页 / 共50页
软件技术基础之指针和结构体课件.ppt_第3页
第3页 / 共50页
软件技术基础之指针和结构体课件.ppt_第4页
第4页 / 共50页
软件技术基础之指针和结构体课件.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《软件技术基础之指针和结构体课件.ppt》由会员分享,可在线阅读,更多相关《软件技术基础之指针和结构体课件.ppt(50页珍藏版)》请在三一办公上搜索。

1、软件技术基础,教材:软件技术基础,黄迪明,电子科大出版社参考书目:数据结构(C语言),严蔚敏,清华大学出版社计算机操作系统,汤子瀛,西安电子科技大学软件工程导论,张海藩,清华大学出版社,软件技术基础,数据结构操作系统软件工程数据库技术网络技术,教学内容,任课教师:黄际彦,联系方式:电话:13880555286 邮箱:,数据结构 操作系统 软件工程,一、前言,硬、软件设计协同设计技术已经成为当前系统设计的一个重要发展趋势。本课程简要介绍了计算机软件设计的一些重要概念,软件技术的基本技术和方法,奠定学生在软件设计方面的坚实基础。,1、目的,2、主要内容,现代电子系统由硬件和软件组成 CPU:控制器

2、、运算器;硬 存储器:内(RAM,ROM)件 外(硬 盘,软盘,光盘等)IO设备:键盘,鼠标和显示器,打印机 传感器:温度、速度、位置等 系统软件:操作系统、语言处理程序、软 工具软件 件 应用软件:面向各种问题的应用程序,现代电子系统,计算机软件是由计算机程序、程序所使用的数据以及相关文档组成的集合。程序是使计算机执行特定任务的指令序列。通常情况下,用各种程序设计语言编写的程序称为源程序,它必须经过语言加工程序将其翻译成用机器代码表示的目标程序才被计算机执行。程序使用的数据是指程序操作的对象。通常以数组,数据文件等形式表示。文档是用自然语言编写的用来描述程序的内容、功能、设计过程以及使用方法

3、的资料。包括设计文档和使用文档。,软件的定义:,数据结构,数据结构:计算机系统中数据的组织形式及其相互关系。数据:客观事物采用计算机进行识别、储存和加工所进行的描述。结构:事物间的相互关系和约束。表现为计算机系统中数据的存储方式。目的:提高计算机的运算效率和合理使用储存空间。计算机能处理的的基本元素就是数据,在软件设计的过程中不仅要考虑数据本身的性质,还要着重考虑数据的存储结构以及相应的操作,使得非数字计算领域问题的解决有了一个良好的理论基础。由于计算机技术的飞速发展,计算机的应用领域的重心从数字计算转移到非数字计算,因此数据结构不仅是一般程序设计的基础,而且是设计实现编译程序、操作系统、数据

4、库系统和大型应用程序的基础。,操作系统,操作系统 操作系统是计算机硬件和其它软件的接口,同时它也是计算机系统的控制和管理中心。DOS、UNIX、WINDOWS、LINUX等都是常用的操作系统。作用:1、提供用户与计算机硬件的接口2、有效控制和管理计算机的软硬件资源3、合理的调度计算机的资源,改善计算机的性能,软件的生产(编写)在早期由于软件的规模小,复杂度低,采用“手工作业”、“软件作坊”的方式足以胜任。而现代软件产品的规模庞大,其复杂度难以估量,必须有一种新的工程化的科学方法来指导软件的生产,在这种背景下产生了软件工程这一门学科,它是每一个软件工程师所必备的知识。,软件工程,课 堂 测 验,

5、一、填空,#include main()int digit_num=0,letter_num=0,int other_num=0;char ch;while(1)ch=getchar();if(ch=!)break;if(ch=0,若键盘输入:123abdh#234DFG%34&hHJk+!_ADD!此程序运行的结果为:,8,11,5。,C语言回顾,C语言特点:1.C是中级语言 它把高级语言的基本结构和语句与低级语言的实用性结合起来。2.C是结构式语言 以函数形式提供给用户的。3.C语言功能齐全 C 语言具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。4.C语言适用范围大 C 语言

6、还有一个突出的优点就是适合于多种操作系统,如DOS、UNIX,也适用于多种机型。,/*Example of c*/包含文件说明#include/子函数说明void vSubfunction(char*cpTemp);Main()/主函数定义/定义局部变量 char cTemp=“call sub-function!”;/调用子函数 vSubfunction(cTemp);/字函数定义void vSubfunction(char*cpTemp)printf(cpTemp);,1、包含文件(一组#include语句)、用户 函数说明部分、全程变量定义、主函数和若干子函数组成。在主函数和子函数中 又

7、包括局部变量定义、若干个库函数、控制流程语句、用户函数的调用 语句等;2、大多数语句结尾必须要用“;”作为终止符。3、有且只有一个主函数。4、使用/*/和/进行注释。5、每个程序必须用一对花括号“”和“”括起来。,1、条件语句if(表达式)语句体1;else语句体2;2、循环语句for(;)语句;while(条件)语句;do 语句;while(条件);,控制流程语句,3、开关语句 switch(变量)case 常量1:语句1或空;case 常量2:语句2或空;default:语句n+1或空;4、break、continue和goto语句,C语言回顾 指针,1、内存:由存储单元组成。其特点为存储

8、单元是线性连续的。存储单元的最小单位是 字节。,2、内存地址:正如我们的住房都有门牌号码一样,为了访问内存中的某个存储单元,我们也要为它编号,这种编号称为内存地址。利用内存地址我们可以访问该地址标识的存储单元。,一、指针的相关基本概念:,Byte,3、程序中一旦定义了一个变量,该变量在内存中就将占用一定的存储单元。变量占用的存储单元总是n(n0)个连续的字节,开始字节的地址,就是变量的地址也可称为该存储单元的首地址。,二、指针的基本概念:,指针就是变量的地址。与此对应,在C语言中使用一类专门的变量即指针变量来存放变量的地址。因此,指针变量是存放地址数据的变量。,从右图可知,指针变量和一般变量一

9、样,仅仅是变量的内容为变量地址的变量而已。,指针变量pi,变量i,变量值,变量地址(指针),变量地址存入指针变量,指向,这里变量和指针变量的类型必须一致。,一般而言,指针变量只能存放某一种数据类型的变量的地址,由此可将指针变量分为:整型指针变量、实型指针变量和字符型指针变量等等,指针变量的类型表明了其指向的存储单元中存放的数据的类型。,当把变量的地址存入指针变量后,我们就认为 这个指针指向了该变量。,指针的定义方式如下:数据类型名*指针变量名;,在定义指针时要注意以下几个问题:,int*ptr1,*ptr2;,三、指针变量的定义:,1 变量前面的“*”不能省略,如果写成:,则表示 ptr2 被

10、定义为整型变量而非整型指针变量。,int*ptr1,ptr2;,2 定义中的“*”表示所定义的变量是指针变量,但 指针变量名为ptr1、ptr2而非*ptr1、*ptr2。,3 指针变量只能指向定义时所规定类型的变量。如 ptr1、ptr2只能指向整型变量而不能指向实型或 字符型变量。,4 定义指针变量后,并未确定该变量指向何处。即是 说该变量的值是不确定的,在引用该指针变量前,必须先让它指向一个变量或在内存中为其分配一个 相应的存储单元。,5 不建议用一个整数给一个指针变量赋初值,如int*pi=2000;原意将地址2000作为指针变量pi的初值,某些编译系统可能能通过上述编译,但是作为编程

11、者很难知道2000地址里面的数据到底是什么。正确做法:int i;int*pi=,四、指针的“&”、“*”和赋值运算:,取地址运算符&的作用是取变量的地址。如:&i 表示求变量 i 的地址。,引用运算符*的作用是取指针指向变量的内容。如:*ptr 表示求指针 ptr 所指向变量的内容。,1、&取地址运算和*引用运算,&运算和*运算是一对逆运算。,若已执行point_1=&a,则(1)&*point_1?(2)*&a?,先对变量 i 作取地址运算,其地址值赋给 point,point指针就已指向变量 i,*point的值为3。给*point 赋值相当于给 i 赋值。,main()int i=3;

12、int*point;point=,2、指针的赋值运算,指针的赋值运算可以是以下两种方式:把地址的值赋给指针变量;把一个指针的值赋给另一个指针。,注意:指针的值为空时,C语言中常用一符号常量 NULL给其赋值。,main()float flt;float*f_ptr=.,下面我们来看一个和“&”“*”和指针赋值语句相关的例子,数组在内存中占用连续的存储单元。指针最常见的一种用途就是指向数组元素。当一个指针指向数组元素后,就可以用它灵活、快速地处理数组元素,从而体现出指针的优势。,main()int*ptr1,*ptr2,*ptr3;int ary5=2,4,8,16,32;ptr1=,五、指针和

13、数组:,(一)、指针和一维数组,C语言中规定数组名代表数组的首地址,即第一个元素的地址。因此ptr3=ary 等价于 ptr3=&ary0;当指针指向数组的首地址时,指针可以象数组一样使用。若指针ptr指向了数组ary的首地址,就有:*(ptr+2)、ptr2、ary2、*(ary+2)这四种形式都表示了数组的第三个元素。,运行结果:*(ptr+2)=5 ptr2=5 ary2=5*(ary+2)=5,#includemain()int*ptr;int ary5=2,9,5,45,3;ptr=ary;printf(“*(ptr+2)=%dn”,*(ptr+2);printf(“ptr2)=%d

14、n”,ptr2);printf(“ary2)=%dn”,ary2);printf(“*(ary+2)=%dn”,*(ary+2);,但是,指针变量与数组名有区别:指针变量是地址变量,数组名是地址常量。即是说指针变量的内容可以在程序运行的过程中被改变,而数组名一旦被初始化,它的值就不能被改变了。,main()int*ptr,i,ary10;ptr=*i;ary=,例要求先打印一个数组中的各元素,然后逆序再打印一遍。,(二)、指针的加减运算:,、指针与整型值的加减的结果是使该指针下移或上移整型值所指定个数的存储单元后的地址。存储单元的大小就是该指针的数据类型所需的内存大小。,、指针之间不允许加运算

15、。,、指针之间的减运算的含义是计算这两个指针相差几个数据元素,其结果是一个整数,可由下式计算:,ptr1-ptr2=(ptr1的值-ptr2的值)/sizeof(指针的类型),1、指针的加减运算(+、-):指针的加减运算有两种形式一是指针与整型值的加减运算;另一种是指针与指针的减运算。,main()int*ptr1,*ptr2,x;int ary5=2,4,6,8,10;ptr1=ary;ptr2=ptr1+3;x=ptr2-ptr1;,2、指针的自加减运算(+、-、+=、-=):+和+=运算是将指针下移一个或几个存储单元;-和-=运算是将指针上移一个或几个存储单元。,main()int*pt

16、r;int ary5=2,4,6,8,10;ptr=ary;ptr+=3;ptr-;ptr-=2;ptr+;,如果先使得指针p指向数组a的首元素(即p=a),则:(1)p+(或者p+=1)之后*p 指向的是a1的值;(2)*p+等同于*(p+),若让b=*p+,则结果为b=a0,p=a+1;(3)*(+p)运算顺序与*(p+)相反;(4)(*p)+,若让b=(*p)+,则b=a0;a0=a0+1;(5)*(p-),*(+p)和*(-p),几个值得注意的地方:,(三)、字符指针与字符串:,main()char string=“Hell0”;printf(“%sn”,string);,main()

17、char*string=“Hell0”;printf(“%sn”,string);,string,str,string,例:将字符串A复制为字符串B。,字符数组和字符指针的使用区别:,1、两者中存放的内容不同;,string,string,str,str,H,e,l,l,o,0,char string10;string=“Hell0!”;,char*string;string=“Hell0!”;,2、赋值的方法不同:,3、指针变量的值是可以改变的,而数组名是常量。,1、指针可以作为函数的参数,这同用数组名作为参数的用法一致:可传递大量数据;可改变参数的值。,六、指针和函数,例:用一个函数来实现

18、交换两个数据。,#include void swap(int*p1,int*p2);main()int x1,x2;x1=100;x2=200;printf(”x1_old=%d,x2_old=%d,a,b);swap(,#include void swap(int p1,int p2);main()int x1,x2;x1=100;x2=200;printf(“x1_old=%d,x2_old=%d”,x1,x2);swap(x1,x2);printf(”x1_new=%d,x2_new=%d“,x1,x2);void swap(int a1,int a2)int temp;temp=a1;

19、a1=a2;a2=temp;,2、返回指针值的函数,类型名*函数名(形参表)函数体 return 地址值;,int*arr3(int a34)int b3,i,j;for(i=0;i3;i+)bi=ai0;for(j=0;j4;j+)if(biaij)bi=aij;return b;,1)定义形式,2)调用形式,int*p,x34;p=arr3(x);,该函数求二维数组中每行的最大数,*不能省略,否则成为普通函数;,返回的必须是地址值;,接收该函数的必须是与该函数 类型相同的指针,指针的使用在给编程提供了一个强有力工具,但使用不当却又可能带来编程中最难对付的问题。指针操作不当,可能读写一些未知

20、的内存单元,严重的是写操作时,就有可能将数据写入一些重要的内存单元,导致程序或系统受到破坏。因此使用指针的正确方法是:使用前必须弄清该指针指向那里。指针的使用是相当重要的,在后面数据结构中链表的构成就是由结构体和指针来完成的。,指 针 小 结,指针是C语言中的一个重要数据类型,是C语言的特色。指针变量就是存放地址的变量,指针除了有“&”、“*”两个单目运算符之外,还可进行加减和自加减等运算。使用指针可:在函数调用的过程中灵活地修改函数中的被调参量(实参);可提高某些程序的效率;指针可用来实现内存空间的动态分配。,假定要统计某系同学的基本情况,包括每个学生的姓名、年龄、身高、体重和各科成绩等。可

21、以为每个学生的各项数据分别定义 一个变量,诸如:name、sex、age、sore5等,但是这样之后各项数据之间的紧密联系在程序形式是就无法体现出来了。如当我们知道了某个学生的姓名,要查询出他的年龄性别等就显得很不方便。,C语言允许我们把一组逻辑是相关联的数据组织起来,作为一个整体使用。这就是结构体的概念。,结构是一组可以整体引用的变量。它与数组的区别在于结构的元素(称为结构成员)不必是相同的数据类型,并且结构成员可以分别加以引用,利用结构可以组织起复杂紧凑的数据结构。在程序中使用结构,首先要定义结构类型;然后在定义结构变量。结构类型定义描述结构成员的名称和它们的数据类型。结构变量定义则根据结

22、构类型为所定义的变量分配存储单元。,C语言回顾 结构体,一、结构类型的定义,结构类型定义的一般形式:,struct 结构名 数据类型名 结构成员1;数据类型名 结构成员n;,struct date int year;int month;int day;;,typedef struct 数据类型名 结构成员1;数据类型名 结构成员n;结构名;,typedef struct int year;int month;int day;tsDate;,C中成员只能是数据,C+中成员可以是数据,也可以是函数,(1)先声明结构体类型再定义变量名:,二、结构变量的定义,struct 结构名 结构变量列表;,例如

23、:struct date today,tomorrow;,(2)在声明类型的同时定义变量:,struct date int year;int month;int day;today,tomorrow;,struct 结构名 数据类型名 结构成员1;数据类型名 结构成员n;结构变量名列表;,(3)先声明结构体类型再定义变量名:,struct int year;int month;int day;today,tomorrow;,struct 数据类型名 结构成员1;数据类型名 结构成员n;结构变量名列表;,注意没有结构类型名。,(4)利用结构体类型的第二种声明定义结构体变量:,typedef st

24、ruct 数据类型名 结构成员1;数据类型名 结构成员n;结构名;,typedef struct int year;int month;int day;tsDate;,例如:tsDate nextday;,两种定义区别:1,省略了struct。2,不能结构的声明和结构变量的定义结合进行。,适用范围:1,提倡使用第一种和第四种方法。将结构类型声明和结构体变量分开,这样在程序比较大的情况下,将结构类型声明放在一个头文件里面,所有的文件通过#include都可以使用这个结构体了。这样利用修改和匹配。每一个使用这个结构体类型的文件就不需要重新定义了。2,第二种方法适用于程序规模较小,只有一个文件需要这

25、个结构体类型的情况。3,第三种方法虽然合法,但不常用。适用程序中只有一方需要这个结构体类型的情况。,关于结构体的几点说明:1,结构体类型是由用户自己定义的,因此不要认为凡是结构体就具有相同的结构。2,类型与变量是不同的概念。结构体类型等同于标准数据类型的int,float等,定义了数据的结构,变量是类型的实例化,系统只对变量分配内存,而我们只能对变量赋值、取值等进行操作。变量由类型定义而来。3,结构体的成员,可以单独使用,作用和地位等同于普通变量。4,结构体里面的成员也可以是一个结构体变量。,struct date int year;int month;int day;,struct stud

26、ent char name20;struct date birthday;int studentID;,struct 结构名 结构变量名=成员1的值,成员2的值,;,例如:struct date nextday=2001,11,10;tsDate nextday=2001,11,10;,三、结构变量的初始化,1、和其他类型一样对结构体变量可以在定义时指定初始值,struct date int year;int month;int day;nextday=2001,11,10;,2、也可以采取分开的形式,在定义变量的时候初始化,struct 结构名 数据类型名 结构成员1;数据类型名 结构成员n

27、;结构变量名=成员1的值,;,nextday:,2字节,2字节,2字节,四、结构的引用,引用的形式:结构变量名.成员名,(1)对结构变量today而言,有效的结构成员为year、month、day。那么today.year、today.month、today.day就是对其各个成员的引用。,(2)C语言允许将一个结构变量作为一个整体赋值给另一个同一类型的结构变量。,Struct date day1=2000,10,24;struct date day2;day2=day1;/*将的day1各成员的值赋给day2*/,printf(“%d”,today.year);/*打印today的结构成员y

28、ear*/today.month=12;/*为today的成员month赋值为12*/,(3)C语言不允许将两个结构变量整体比较,只能逐个成员的进行比较。,if(day1=day2)/*错误*/,if(day1.year=day2.year&day1.month=day2.month&day1,day=day2.day)/*正确*/,(4)另一种引用的形式:结构指针变量名 成员名定义:struct date*today;today 为指向该结构的指针,printf(“%d”,todayyear);/*打印today指向结构的成员year*/today month=12;/*为today指向的结

29、构的成员month赋 值为12*/,(5)若成员本身也是一个结构体类型,则需要用若干个成员运算符,一级一级找到最低级。定义:struct student student1,*pstudent1;Pstudent1=&student1;,printf(“%d”,student1.birthday.year);/*打印student1的结构体成员birthday的成员year*/pstudent1 birthday.year=12;/*为pstudent1指向的结构的结构体成员birthday的成员year赋值12*/,(6)对结构体变量的成员可以像普通变量一样进行各种运算。定义:struct s

30、tudent student1;,Student1.studentID+=(Student1.studentID)+,例:结构例程。,可见,“”和“”操作符分别使用在用指向结构的指针和用结构变量来访问结构中的数据项(成员)时。,五、结构体数组,一个结构体变量中可以存放一组数据(如一个学生的学号,生日等)。如果有10个学生的数据需要运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于:每个数组元素都是一个结构体类型的数据,它们分别包括各个成员项。,1、定义结构体数组,struct student char name20;date birthday;int stu

31、dentID;;struct student stu2;,struct student char name20;date birthday;int studentID;stu2;,类型声明与数组定义分开,类型声明与数组定义结合,2、结构体数组的初始化,struct student char name20;date birthday;int studentID;;struct student stu2=“Li Lin”,1981,5,1,1001,“Wan Tao”,1981,1,1,1002;,struct student char name20;date birthday;int stude

32、ntID;stu2=“Li Lin”,1981,5,1,1001,“Wan Tao”,1981,1,1,1002;,stu0:stu1:,3、结构体数组的引用,#include/定义结构体date和student,这里省略main()struct student stu2=Li Lin,1981,5,1,1001,Wan Tao,1981,1,1,1002;printf(name=%s n,stu0.name);printf(name=%s n,stu1.name);struct student*pstudent;pstudent=,(1)结构体数组名i.成员项(2)结构体数组指针-成员项,s

33、tu0:,stu1:,pstudent,(+pstudent),注意(+pstudent)-name中()不能省略,也不能为(pstudent+)-name,4、用结构体变量和指向结构体变量的指针构成链表,链表是一个常见的非常重要的数据结构。数组需要连续的内存空间存放数组,而链表中各元素的存储单元可以是不连续的,因此链表可以有效的提高内存的利用率。常见的链表结构为:,head,1249,1356,1475,链表有一个“头指针”变量,图中以head表示,它存放一个地址。该地址指向链表的一个“结点”,每个结点由两部分组成(1)用户实际数据,如A,B,C。(2)下一个结点的地址。因此只要知道头指针,

34、就可以顺着结点的地址,找到链表上的任意一个结点。最后一个结点不再指向其他结点,被称为表尾,它的地址部分放一个”NULL”(表示空地址),链表到此结束。,由于链表由两部分组成,一为用户实际数据,另外部分为指向下一个结点的指针,这两部分的数据类型是不一样的,所以需要结构体来构建链表。现在考虑下面一个链表:,head,num,score,next,这个链表的每个结点由三个不同类型的成员项构成,下面由结构体构造这个链表:,struct student int num;float score;student*next;;,#include/定义结构体student,这里省略main()student a,b,c,*head,*p;a.num=31001;a.score=89.5;b.num=31003;b.score=90;c.num=31007;c.score=85;a.next=,结 构 体 小 结,结构体是C语言中的一种复杂(构造)类型,它是一种被命名为一个标识符的各种变量的集合。结构的定义确定了结构变量或结构指针的格式,结构是软件设计中实现数据抽象的基础。,本章要求掌握结构定义的基本概念和方法,结构变量和结构指针的含义以及利用结构变量或结构指针来引用结构成员的基本方法。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号