结构体与共用体汇总_第1页
结构体与共用体汇总_第2页
结构体与共用体汇总_第3页
结构体与共用体汇总_第4页
结构体与共用体汇总_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、问题的提出问题的提出学号学号 姓名姓名 年龄年龄 性别性别 成绩成绩1 成绩成绩2 平均成绩平均成绩 1 AA 19 M 80 90 90 2 BB 18 F 78 70 73 3 CC 17 M 81 75 79 4 DD 18 F 80 60 75 5 EE 19 M 76 83 83每行的数据类型不相同,如何表示此二维数据?每行的数据类型不相同,如何表示此二维数据?如何交换两行值?如何交换两行值? 能否将一行看成一个整体?能否将一行看成一个整体?结构体结构体定义一种类型,把不同的数据作为一个整体来定义一种类型,把不同的数据作为一个整体来处理处理什么是结构体什么是结构体 结构体结构体(st

2、ruct)是由一系列具有相同类型或不同类型是由一系列具有相同类型或不同类型的数据构成的数据集合,是程序员为了方便操作数据的数据构成的数据集合,是程序员为了方便操作数据而而自定义的数据类型自定义的数据类型。优点:优点: 方便应用数据方便应用数据 使得程序更加易读与理解使得程序更加易读与理解 可以整体赋值可以整体赋值与数组的区别:与数组的区别: 数组是用来存性质相同的数据,结构体是存性质数组是用来存性质相同的数据,结构体是存性质不同但相关的数据。不同但相关的数据。学习目标学习目标 掌握结构体的定义掌握结构体的定义 掌握结构体变量的声明掌握结构体变量的声明 掌握结构体变量成员的引用掌握结构体变量成员

3、的引用 理解结构和函数之间的关系、掌握结构作为参理解结构和函数之间的关系、掌握结构作为参数传递与返回结构的函数方法数传递与返回结构的函数方法 理解结构中数组的用法理解结构中数组的用法9.1 结构体的定义及应用结构体的定义及应用 结构体类型属于用户自定义类型,与指针类型有类似之结构体类型属于用户自定义类型,与指针类型有类似之处,必须先定义数据类型,然后再定义该种类型的变量。处,必须先定义数据类型,然后再定义该种类型的变量。 9.1.1 定义结构体类型定义结构体类型struct 类型标识符类型标识符 成员名成员名1; 类型标识符类型标识符 成员名成员名2; . 类型标识符类型标识符 成员名成员名n

4、;; 可为简单类型可为简单类型也可为构造类型也可为构造类型定义结构体类型定义结构体类型 例如例如1:struct dateint year; int month;int day;例如例如2:struct studentintID;char name20;char gender;date birthday;double score3; 【例例】以学生档案为例,假设包括如下数以学生档案为例,假设包括如下数据项据项 学号(学号( ID ):整型):整型 姓名(姓名(name):字符串):字符串 性别(性别( gender ):字符型):字符型 出生日期(出生日期(birthday):):date结构

5、体结构体 三门课成绩(三门课成绩(score):一维实型数组):一维实型数组说明说明 (1) 结构体类型是一种构造数据类型结构体类型是一种构造数据类型,它与,它与int, char,float等系统定义的基本数据类型具有同等地位,等系统定义的基本数据类型具有同等地位,是由用户自行定义的。是由用户自行定义的。(2) 结构体类型不分配任何存储空间结构体类型不分配任何存储空间。相应结构体类型的变量、数组及动态开辟的相应结构体类型的变量、数组及动态开辟的存储单元占存储空间。存储单元占存储空间。构造的数据类型可以用来定义变量构造的数据类型可以用来定义变量9.1.2 定义结构体类型的变量定义结构体类型的变

6、量 1先定义结构体类型再定义变量先定义结构体类型再定义变量例如:例如: struct student /表示结构体的类型,如表示结构体的类型,如int,charint ID;charname20;chargender;datebirthday;double score3; student John, Merry;/表示属于表示属于student类型的变量类型的变量9.1.2 定义结构体类型的变量定义结构体类型的变量 2在定义结构体类型的同时定义结构体变量在定义结构体类型的同时定义结构体变量struct studentintID;char name20;char gender;date birt

7、hday;double score3;John, Merry; 9.1.3 初始化结构体类型的变量初始化结构体类型的变量 初始化方法有两种:初始化方法有两种:v一种是用花括号一种是用花括号“ ”括起来的值对结构体变量初括起来的值对结构体变量初始化;例如:始化;例如:student John = 801,Joe,f,1990,6,16,88,99,80; v另一种是用同类型的结构体变量初始化另外一个另一种是用同类型的结构体变量初始化另外一个结构体变量。结构体变量。 student Merry = John; 结构体可以整体赋值。结构体可以整体赋值。9.1.4 结构体类型变量及其成员的引用结构体类

8、型变量及其成员的引用 1引用结构体变量的成员引用结构体变量的成员“.”例如:例如:John.ID=801;2整体引用结构体变量整体引用结构体变量student John = 801,Joe,f,1990,6,16,88,99,80; student Merry;Merry = John; / 对结构体变量整体赋值对结构体变量整体赋值注意:注意:(1) 不能将结构体变量作为一个整体进行输入或输出不能将结构体变量作为一个整体进行输入或输出例如:例如:cout Merry;/ 错误错误(2) 结构体变量可以用作函数的参数,属于按值传递。结构体变量可以用作函数的参数,属于按值传递。(3) 函数可以返回

9、一个结构体变量。函数可以返回一个结构体变量。【例例】在在main函数中输入一个学生的学号、姓名、性别、出生函数中输入一个学生的学号、姓名、性别、出生日期和日期和3门课程的成绩,在另一函数门课程的成绩,在另一函数print中输出这个学生的中输出这个学生的信息,采用结构体作为函数参数。信息,采用结构体作为函数参数。 struct date int year; int month;int day;struct student intID;char name20;char gender;date birthday;double score3;void print( student );void mai

10、n ( ) student John;/ 定义一个结构体变量定义一个结构体变量 cin John.ID J John.gender; cin John.birthday.year ; cin John. birthday.month; cinJohn.birthday.day cinJohn.score0 John.score1 John.score2; print(John);/ 调用函数完成输出调用函数完成输出void print( student s)/ 输出参数输出参数s成员的值成员的值 cout 学号学号: setw(5) s.ID endl; cout 姓名姓名:

11、setw(5) endl; cout 性别性别: setw(5) s.gender endl; cout生日生日:setw(5)s.birthday.year; cout setw(5) s.birthday.month ; cout setw(5) s.birthday.day endl; cout成绩成绩s.score0s.score1s.score2endl; 9.1.5 结构体数组结构体数组1定义结构体数组和初始化定义结构体数组和初始化 定义的形式:定义的形式: student studOne4; 初始化的形式:初始化的形式:student studOne4 = 801,

12、 Joe, F, 1990, 6, 16, 88, 99, 80,802, Smith,F, 1991, 6, 1, 68, 79, 87,805, Merry,M, 1992, 3, 23, 78, 89, 79,808, Anna, M, 1993, 7, 6, 98, 69, 68; 9.1.5 结构体数组结构体数组2使用结构体数组使用结构体数组引用元素:引用元素:for(int i=0; i4; i+) cout studO;【例例】求若干个学生的平均成绩求若干个学生的平均成绩 struct stud int num; char name20; int age; cha

13、r sex; int score; ;float average(stud *studs1, int n) float aver=0; for(int i=0; in; i+) aver += studsi.score; aver /= n; return aver;int main(void) stud studs4= 020110101, Wu, 19, M, 80, 020110102, “Li, 18, F, 95, 020110103, “Zhang, 18, F, 78, 020110104, “Zhao, 20, M, 80; float aver ; aver=average(

14、studs, 4); cout 平均成绩为平均成绩为: aver endl; return 0; struct person char name20; int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=0;j3;j+)if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i成员名成员名结构体变量名结构体变量名.成员名成员名

15、指向运算符指向运算符优先级优先级: 1: 1结合方向:从左向右结合方向:从左向右例例 指向结构体的指针变量指向结构体的指针变量例 int n; int *p=&n; *p=10; n=10struct student stu1;struct student *p=&stu1;stu1.num=101; (*p).num=1019.1.6 结构体和指针结构体和指针使用结构体指针变量引用成员形式使用结构体指针变量引用成员形式对于以下的变量定义,表达式(对于以下的变量定义,表达式( )不符合)不符合C语言语言语法。语法。 struct node int len ; char *pk;

16、 x= 2,right, *p=&x;(A)p-pk (B) (*p).pk (C) *p.pk (D) x.pk答案答案:C有以下程序段有以下程序段struct stint x;int *y;*pt;int a2=1,2,b2=3,4; struct st c2=10,a,20,b; pt=c;以下选项中表达式的值为以下选项中表达式的值为11的是的是_。A *pt-y B pt-x C +pt-x D (pt+)-x 答案答案:C用结构体变量的成员作参数用结构体变量的成员作参数-值传递值传递用指向结构体变量或数组的指针作参数用指向结构体变量或数组的指针作参数-地址传递地址传递用结构体

17、变量作参数用结构体变量作参数-多值传递多值传递,效率低,效率低用指向结构体的指针作函数参数用指向结构体的指针作函数参数struct data int a, b, c; ;main() void func(struct data); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a

18、,arg.b,arg.c);void func(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Process.n); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf(parm.a=%d parm.b=%d parm.c=%dn,parm.a,parm.b,parm.c); printf(Return.n);arga :27b: 3c :30(main)(func)parma :27b: 3c :30copyarga :

19、27b: 3c :30(main)(func)parma :18b: 5c :90arga :27b: 3c :30(main)arga :27b: 3c :30(main)例例 用结构体变量作函数参数(用结构体变量作函数参数(1)struct data int a, b, c; ;main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call

20、 Func().n); func(&arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c);void func(struct data *parm) printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c); printf(Process.n); parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(parm-a=%d parm-b=%d parm-c=%dn,parm-a,parm-b,parm-c); print

21、f(Return.n);arga :18b: 5c :90(main)arga :27b: 3c :30(main)arga :27b: 3c :30(main)(func)parm*arga :18b: 5c :90(main)(func)parm*例例 用结构体指针变量作函数参数(用结构体指针变量作函数参数(2)&构造数据类型构造数据类型,也叫联合体也叫联合体&用途:使几个不同类型的变量用途:使几个不同类型的变量共占一段内存共占一段内存(相互覆盖相互覆盖)共用体类型定义共用体类型定义定义形式:定义形式:union 共用体名共用体名 类型标识符类型标识符 成员名;成员名; 类

22、型标识符类型标识符 成员名;成员名; .;例例 union data int i; char ch; float f; ;类型定义类型定义不分配内存不分配内存9.2 共用体共用体形式一形式一: : union data int i; char ch; float f; a,b;形式二形式二: : union data int i; char ch; float f; ; union data a,b,c,*p,d3;形式三形式三: : union int i; char ch; float f; a,b,c;共用体变量定义共用体变量定义分配内存分配内存,长度长度=最长成员最长成员所占字节数所占

23、字节数共用体变量任何时刻共用体变量任何时刻只有只有一个成员一个成员存在存在共用体变量的定义共用体变量的定义abfchifchi引用方式:引用方式:引用规则引用规则不能引用共用体变量,只能不能引用共用体变量,只能引用其成员引用其成员共用体指针名共用体指针名-成员名成员名共用体变量名共用体变量名.成员名成员名(*共用体指针名共用体指针名).成员名成员名union data int i; char ch; float f; ; union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.f共用体变

24、量中起作用的成员是共用体变量中起作用的成员是最后一次存放的成员最后一次存放的成员例例 union int i; char ch; float f; a; a=1; ( ) 不能不能在定义共用体变量时在定义共用体变量时初始化初始化例例 union int i; char ch; float f; a=1,a,1.5; ( ) 例例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); ( 编译通过,运行结果不对编译通过,运行结果不对) 可以用一个共用体变量为另一个变量赋值可以用一个共用体变量为另一个变量赋值例例 float x; union int i; char

25、ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; ( ) x=a.f; ( )共用体变量引用共用体变量引用联系联系: 两者可相互嵌套两者可相互嵌套区别区别: 存储方式不同存储方式不同struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k变量的各成员同时存在变量的各成员同时存在任一时刻只有一个成员存在任一时刻只有一个成员存在结构体与共用体结构体与共用体枚举枚举枚举类型的定义:枚举类型的定义:enum 枚举类型名枚举类型名 枚举表枚举表;枚举变量的说明:枚举变量的说明:en

26、um 枚举类型名枚举类型名 变量名表;变量名表;enum color black,blue,red,green;enum color col;元素的值依次为元素的值依次为0,1,2,3enum week sun=7,mon=1,tue,wen,thu,fri,satday;可以人为指定元素序号值可以人为指定元素序号值#includeenum coin penny, nickel, dime, quarter, half_dollar, dollar;char *name=penny,nickel,dime,quarter, hal_fdollar, dollar;void main()enum

27、 coin money1,money2;money1=dime;money2=dollar;printf(n%d %d,money1,money2);printf(n%s %sn,name (int)money1,name(int)money2); 功能:用自定义名字为功能:用自定义名字为已有已有数据类型命名数据类型命名 类型定义类型定义简单形式:简单形式: typedef type name;例例 typedef int INTEGER;类型定义语句关键字类型定义语句关键字已有数据类型名已有数据类型名用户定义的类型名用户定义的类型名 例例 typedef float REAL;类型定义后类型定义后,与已有类型一样使用与已有类型一样使用例例 INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; 说明说明:1.typedef 没有创造没有创造新数据类型新数据类型2.typedef 是定义类型是定义类型,不能定义变量不能定义变量3.typedef 与与 define 不同不同 define typedef预编译时处理预编译时处理 编译时处理编译时处理简单字符置换简单字符置换 为已有类型命名为已有类型命名 用用typedef定义类型定义类型例例 定义数组类型定义数组类型 int a100;

温馨提示

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

评论

0/150

提交评论