欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第8章 指针、结构体与共用体1.pptx

    • 资源ID:15237008       资源大小:1.27MB        全文页数:61页
    • 资源格式: PPTX        下载积分:30金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要30金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第8章 指针、结构体与共用体1.pptx

    课程主讲人:第8章 指针、结构体与共用体1C语言程序设计3C语言程序设计(第二版)4第8章 指针、结构体与共用体1本章通过一个简单的案例引入,介绍了指针的基本概念、指针运算、指针与数组等内容。2同时也重点介绍结构体、共用体、枚举等各种复合数据类型的定义及使用方法,介绍了使用typedef重新定义类型名的方法。5第8章 指针、结构体与共用体知识点:指针的概念和使用。指针的运算。指针和数组的关系。结构体的概念、定义和使用。结构体数组和结构体指针。共用体的概念、定义和使用。枚举的概念、定义和使用。使用typedef重新定义类型名。技能点:能熟练掌握Dev-C+集成环境的操作步骤。6第8章 指针、结构体与共用体8.1 案 例 引 入【例8-1】使用结构数组表示学生成绩,使用结构数组的初始化来代替手工数据录入,实现计算学生平均成绩和统计不及格人数的功能,并显示不及格学生的姓名。任务分析:要完成题目要求,需定义一个结构体和定义结构数组,并计算及显示题目所要求的数据。此题需学习指针和结构体等知识点。7第8章 指针、结构体与共用体程序代码:打开链接8第8章 指针、结构体与共用体8.2 指 针8.2.1 地址和指针1地址在执行程序时,程序中定义的变量在内存中占据一定的存储单元,用于存放变量的数据。编译系统根据变量定义时指定的数据类型确定该变量所占据的存储单元数量以及数据在存储单元中存放的形式。在程序中,用变量名引用变量值,或引用变量的存储位置(例如scanf中的&)。9第8章 指针、结构体与共用体在对应的目标程序中,源程序访向变量的变量名,就已经被转换成变量的实际存储地址,按变量的地址引用值或赋值,所以源程序中的变量名是其存储空间的抽象。变量名和实际存储空间的映射关系如图8-2所示。 图8-2 变量名与内存单元地址的对应关系10第8章 指针、结构体与共用体从图8-2中可以看到,计算机的内存储器就像一个巨大的一维数组,每个数组元素就是一个存储单元(一个字节);类似每个数组元素的下标,每个内存单元都有一个编号(无符号整数),称为该单元的地址;内存单元的地址与所定义的变量是一一对应的,保证了引用该变量的值时不会发生错误。11第8章 指针、结构体与共用体变量的数据类型决定变量所占内存单元的大小,即占用几个连续的字节空间,对应当前变量的第一个字节的内存地址,就是该变量的内存地址(int类型的变量在Turbo C中占两个字节,在Dev-C+中占4个字节)。12第8章 指针、结构体与共用体如果在不同的平台要知道各种数据类型的大小,可以用以下语句来测试:printf(%dn,sizeof(数据类型);例如:printf(%dn,sizeof(int);在Dev-C+系统中,打印输出的值为4,表示int数据类型占用4个字节的宽度。13第8章 指针、结构体与共用体2指针变量一旦获得编译系统为其分配的存储单元,该存储单元的起始字节的编号就称为该变量的地址或指针,即指针就是变量的存储地址。如图8-2所示,2000是变量i的地址,也叫i的指针,2002就是变量j的指针。14第8章 指针、结构体与共用体8.2.2 声明指针变量在定义指针变量时,需要用指针运算符“*”表示变量是用来存放其他变量地址的指针变量。同时,需要声明变量的类型,以便能通过指针正确访问特定类型的数据。定义指针变量的一般形式为:类型标识符 *指针变量名;例如:int *p1;/定义p1为指向整型变量的指针变量char *p2;/定义p2为指向字符型变量的指针变量15第8章 指针、结构体与共用体在定义指针变量时需要注意以下几方面:(1)在指针变量定义中,“*”是一个说明符,它表明其后的变量是指针变量。(2)指针变量定义时指定的数据类型不是指针变量本身的数据类型,而是指针变量所指向的对象的数据类型,指针变量本身没有数据类型。(3)指针变量存放的是所指向的某个变量的地址值。(4)指针变量并不固定指向一个变量,可指向同类型的不同变量。16第8章 指针、结构体与共用体若有定义“int a,*pa;”,该语句仅仅定义了指针变量pa,但指针变量并未指向任何确定的变量。因为这些指针变量还没有被赋予确定的地址值,只有将某一具体变量的地址赋给指针变量之后,指针变量才指向确定的变量。可以在定义指针变量的同时进行初始化。例如:int a,*pa = &a;要注意,当要声明多个指针变量时,必须在每个指针变量名前加上“*”,例如:int *iptr1,*iptr2,iptr3; /iptr1和iptr2是指向整型变量的指针变量,而iptr3是整型变量17第8章 指针、结构体与共用体8.2.3 指针的基本操作1指针变量的赋值指针变量在使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱甚至死机。可以用赋值表达式语句给指针赋值,也可以在定义指针的同时给它赋值。例如:int x,*p = &x;这是给指向int型变量的指针P赋初值,即将int型变量x的地址值赋给p。也可以写成赋值表达式的形式,如下所示:int x,*p;p = &x;18第8章 指针、结构体与共用体使用指针进行赋值运算时要注意以下几种情况:(1)给指针变量赋值时,指针变量前不能加“*”说明符。下面的写法是错误的:int i;int *p;*p = &i; /错误,指针变量p前面加“*”表示间接访问19第8章 指针、结构体与共用体(2)指针变量未指向具体有效地址,间接访问会有问题。例如:int *p;/指针变量p未赋值,指向不明确*p = 100;/向p指向的地址空间赋值100(3)不能用一个数给指针变量赋值。下面的赋值是错误的:int *pi;pi = 10;但是,可以用0给指针赋值,也可用符号常量NULL表示,代表空指针,不指向任何内存单元。20第8章 指针、结构体与共用体(4)指针变量的值是可以改变的。例如:int i1 = 3,i2 = 4,*pi; /定义指针变量 pipi = &i1;/变量 pi 指向 i1pi = &i2;/改变指针变量pi的指向,使其指向i2上例中,pi开始指向整型变量i1,接着改变pi的指向。指针变量pi的指向变化如图8-3和图8-4所示。图8-4 指针变量pi变化后的指向图8-3 指针变量pi的初始指向 21第8章 指针、结构体与共用体(5)指针变量只能用同类型的地址赋值。例如:float *p; /p是指向浮点类型变量的指针变量char c;/宇符变量p = &c;p只能存储float型数据的地址,用字符型数据地址赋值是错误的。22第8章 指针、结构体与共用体【例8-2】通过交换指针变量改变变量的值。任务分析:定义两个指针,分别指向两个变量,然后交换指针变量,最后用printf()函数通过指针变量输出变量的值。程序分析:程序开始定义了两个整型变量i1、i2,又定义了指向整型变量的指针pi1、pi2、pi3。指针变量pi1、Pi2、pi3分别指向i1、i2和空,然后交换指针变量pi1、pi2和pi3。23第8章 指针、结构体与共用体程序代码:打开链接24第8章 指针、结构体与共用体2指针运算符1)取地址运算符(&)作用:用于变量名之前,表示变量的存储地址。其操作数可以是各种类型的简单变量、数组元素、结构成员,不能用于表达式、常量和寄存器变量,是描述变量地址的工具。例如:int x;scanf(%d,&x);上例中,&x给出变量x的存储单元的地址,作为存放输入数据的指针,将数据存入变量x的存储单元中。2)指针运算符(*)。作用:定义指针变量;通过指针实现“间接访问”存储单元的数据。25第8章 指针、结构体与共用体【例8-3】通过指针实现“间接访问”存储单元的数据。任务分析:声明指针变量,然后对指针变量赋值,最后通过printf()函数在屏幕输出变量的值。程序代码如下:程序分析:程序中j=*pi是将指针pi所指的存储单元的内容赋给变量j,实际上是对变量i的间接存取。*pi意为指针变量pi所指的变量,相当于变量i的值。26第8章 指针、结构体与共用体程序代码:打开链接27第8章 指针、结构体与共用体3)&和*运算符&和*两个运算符的优先级是相同的,结合规律是右结合性。例如,若“pi = &i;”,则&*pi等价于&i,等价于i,(*pi)+等价于i+。4)算术运算符+、-、+;、-+:地址表达式(pi) + 整型表达式(in),结果为pi当前所指的地址向地址大的方向移动inpi所指类型占用的内存字节数个字节后的地址。-:地址表达式(pi) - 整型表达式(in),结果为pi当前所指的地址向地址小的方向移动inpi所指类型占用的内存字节数个字节后的地址。28第8章 指针、结构体与共用体+:地址变量(pi)+或者+地址变量(pi),结果为pi当前所指的地址向地址大的方向移动一个字节后的地址。-:地址变量(pi)-或者-地址变量(pi),结果为在pi当前所指的地址向地址小的方向移动一个字节后的地址。29第8章 指针、结构体与共用体【例8-4】通过指针算术运算符的计算,在屏幕上输出运算后的结果。任务分析:首先定义几个指针变量指向数组元素,然后调用+、-、+、-等运算符进行指针运算,最后通过printf()函数输出指针指向的变量的值。30第8章 指针、结构体与共用体程序代码:打开链接31第8章 指针、结构体与共用体程序分析:*pi+:由于+和*的优先级相同,结合方向为自右而左,等价于*(pi+)。先取*pi,然后将pi加1。表达式的值为arr1,pi的值为&arr2。*+pi:等价于*(+pi)。先将pi加1,然后取*pi。表达式的值为arr2,pi的值为&arr2。(*pi)+:先取*pi,然后将*pi加1。表达式的值为arr1+,arr1的值改变了;pi的值为&arr1,pi的值未改变。pi2 - pi1:pi2和pi1相差两个整型数所占字节数的大小,它的返回值不是相差的字节数,而是相差整数的个数,所以值为2。32第8章 指针、结构体与共用体8.2.4 指针和数组指针和数组有着密切的关系,任何能由数组下标完成的操作也都可用指针来实现,但程序中使用指针可使编程代码更紧凑、更灵活。1指针与一维数组在C语言中,一维数组的数组名实际上就是指向数组标为元素的指针。33第8章 指针、结构体与共用体例如,若有如下定义:int a5 = 1,2,3,4,5,*p;p = a;则数组a中的元素与数组名a及指针p的关系如图8-8所示。34第8章 指针、结构体与共用体其中,数组名a的类型是整型指针int *,并且指向数组元素a0,即a中存放的地址为&a0。在前面已经介绍,通过指针运算符可以访问指针所指向的数据,因此可以用来访问元素a0。当然,以这种方式不仅可以访问数组元素a0,还可以访问数组中的其他元素。例如,*(a+1)可以访问a1,*(a+2)可以访问a2,一般来说,用*(a+i)可以访问ai,即*(a+i)和ai是完全等价的。35第8章 指针、结构体与共用体同样,指向一维数组首元素的任何指针也可以像一维数组名那样使用。由于指计p和数组名a均是指向数组a的首元素的指针,即p和a是完全等价的。因此,访问数组a中下标为i的元素,可以使用如下4种表示形式:ai、pi、*(a+i)、*(p+i)。对于数组名a来说,在C语言中认为是指针常量而不是变量,所以不能改变a的值,若写成“a+”是错误的。在前面的章节中,已经学习过使用“数组名下标”的方法访问数组中的指定元素,下面将学习如何通过指针的运算来访问一维数组中的数组元素。36第8章 指针、结构体与共用体【例8-5】使用数组名和指针来访问一维数组中的每个元素。任务分析:程序中通过使用ai、pi、*(a+i)、*(p+i)和*p来访问一维数组中的每个元素。程序代码如下:37第8章 指针、结构体与共用体程序代码:打开链接38第8章 指针、结构体与共用体2指针与字符数组在C语言中,没有字符串类型,是通过字符型数组作为字符串的存储空间的。数组名就是指针,那么任何指向字符型数组首元素的指针都可以代表存储于该处的字符串。因为字符数组中存放字符串,使用很广泛,所以也可使用指针对字符数组进行访问,使字符串的各种操作更加方便。39第8章 指针、结构体与共用体在字符串处理过程中,若指针P已指向某个字符串,判断字符串是否到尾部,一般采用语句:while(*p != 0) 来进行判断。字符串的操作通常可以进行字符串的复制、比较等,所以使用两个指针分别指向两个字符串,复制字符串或比较对应位置字符是否相同,读者应熟练掌握指针在字符数组中的使用。40第8章 指针、结构体与共用体【例8-6】使用指针来访问一维字符数组。任务分析:当字符指针指向某个字符数组后,可使用该指针对字符串进行整体输入、输出,还可以将该字符串按单个字符逐个进行输出。若有两个字符串,可用两个指针分别指向这两个字符串首部,逐个进行赋值,实现字符串复制或比较的功能。程序中给出字符串复制的方法,请读者自行实现两个字符串的比较功能。程序代码如下:41第8章 指针、结构体与共用体程序代码:打开链接42第8章 指针、结构体与共用体在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,语言中给出了另一种构造数据类型“结构(structure)”或叫“结构体”。它相当于其他高级语言中的记录。8.3 结 构 体43第8章 指针、结构体与共用体“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构即是一种“构造”而成的数据类型,在说明和使用之前必须先定义它,也就是构造它,如同在说明和调用函数之前要先定义函数一样。8.3 结 构 体44第8章 指针、结构体与共用体8.3.1 结构体类型的定义定义结构体的一般形式为:struct 结构名 成员表列;成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:类型说明符 成员名;45第8章 指针、结构体与共用体成员名的命名应符合标识符的书写规定。例如:struct stu int num; char name20; char sex; float score;在这个结构定义中,结构名为stu,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意在括号后的分号是不可少的。结构定义之后,即可进行变量声明。凡声明为结构stu的变量都由上述4个成员组成。由此可见,结构是一种复杂的数据类型,是数目固定、类型不同的若干有序变量的集合。46第8章 指针、结构体与共用体8.3.2 定义结构体类型的变量声明结构变量有以下3种方法,这里以上面定义的stu为例来加以说明。1先定义结构,再说明结构变量例如:struct stu int num; char name20; char sex; float score;struct stu boy1,boy2;声明了两个变量boy1和boy2为stu结构类型。也可以使用宏定义一个符号常量来表示一个结构类型。47第8章 指针、结构体与共用体例如:#define STU struct stuSTU int num; char name20; char sex; float score;STU boy1,boy2;48第8章 指针、结构体与共用体2在定义结构类型的同时声明结构变量例如:struct stu int num; char name20; char sex; float score;boy1,boy2;这种形式声明的一般形式为:struct 结构名 成员表列变量名表列;49第8章 指针、结构体与共用体3直接声明结构变量例如:struct int num; char name20; char sex; float score;boy1,boy2;这种形式声明的一般形式为:struct 成员表列变量名表列;第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。3种方法中声明的boy1、boy2变量都具有图8-11所示的结构。50第8章 指针、结构体与共用体图8-11 结构体一个数据结构图声明了boy1、boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。在上述stu结构定义中,所有的成员都是基本数据类型或数组类型。51第8章 指针、结构体与共用体成员也可以又是一个结构,即构成了嵌套的结构。例如,图8-12给出了另一个数据结构。 图8-12 结构体另一个数据结构图52第8章 指针、结构体与共用体按图8-12可给出以下结构定义:struct date int month; int day; int year;struct int num; char name20; char sex; struct date birthday; float score;boy1,boy2;首先定义一个结构date,由month(月)、day(日)、year(年)3个成员组成。在定义并声明变量boy1和boy2时,其中的成员birthday被声明为data结构类型。成员名可与程序中其他变量同名,互不干扰。结构变量的赋值就是给各成员赋值,可用输入语句或赋值语句来完成。53第8章 指针、结构体与共用体【例8-7】给结构变量赋值并输出其值。程序代码如下:程序分析:本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量。用scanf语句动态地输入sex和score成员值,然后把boy1的所有成员的值整体赋予boy2。最后分别输出boy2的各个成员值。例8-7表示了结构变量的赋值、输入和输出的方法。54第8章 指针、结构体与共用体程序代码:打开链接55第8章 指针、结构体与共用体8.3.3 结构体变量的初始化和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。【例8-8】对结构变量初始化。程序代码如下:程序分析:本例中,boy2、boy1均被定义为外部结构变量,并对boy1作了初始化赋值。在main()函数中,把boy1的值整体赋予boy2,然后用两个printf语句输出boy2各成员的值。56第8章 指针、结构体与共用体程序代码:打开链接57第8章 指针、结构体与共用体8.3.4 结构体类型变量的引用在程序中使用结构变量时,往往不把它作为一个整体来使用。在ANSI C中除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算等都是通过结构变量的成员来实现的。表示结构变量成员的一般形式是:结构变量名.成员名58第8章 指针、结构体与共用体例如:boy1.num /第一个人的学号boy2.sex /第二个人的性别如果成员本身又是一个结构,则必须逐级找到最低级的成员才能使用。例如:即第一个人的出生月份成员可以在程序中单独使用,与普通变量完全相同。59第8章 指针、结构体与共用体8.3.5 结构体数组数组的元素也可以是结构类型的,因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。例如,一个班的学生档案、一个车间职工的工资表等。方法和结构变量相似,只需声明它为数组类型即可。60第8章 指针、结构体与共用体例如:struct stu int num; char *name; char sex; float score;boy5;定义了一个结构数组boy,共有5个元素,boy0 boy4。每个数组元素都具有struct stu的结构形式。对结构数组可以作初始化赋值。61第8章 指针、结构体与共用体例如:struct stu int num; char *name; char sex; float score; boy5 = 101,Li ping,M,45, 102,Zhang san,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58;当对全部元素作初始化赋值时,也可不给出数组长度。

    注意事项

    本文(第8章 指针、结构体与共用体1.pptx)为本站会员(春哥&#****71;)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开