C语言-结构体与共用体
《C语言参悟之旅》第九章 结构体 共用体
![《C语言参悟之旅》第九章 结构体 共用体](https://img.taocdn.com/s3/m/0ac1ca254b35eefdc8d33315.png)
2. 第二种形式
这种形式在声明类型的同时定义变量。其一般形式为:
struct 结构体类型名
{
数据类型名 1 成员名 1;
… 数据类型名 n
成员名 n;
} 变量名列表;
同样是定义两个 hero 类型变量 wusong 和 sunerniang,用此种形式定义如下:
struct hero {
int number; char sex; char star_name[20]; char name[20]; char nickname[20]; char position[20]; char weapon[20]; } wusong,sunerniang;
//绰号 //职业 //使用武器
} wusong={14,'m',"天伤星","武松","行者","步兵头领","2 把戒刀"}; //定义了结构体变量 wusong 并初始化
定义结构体变量 wusong 但没有初始化时,编译器会给每个成员一个默认值,初始化后 就赋予初始化时的赋值,如图 9.4 所示。
在现实生活中可以用结构体表示的事物比比皆是,例如,我国四大名著之一——《水浒
传》,其中包括性格各异的 108 个人物,如果现在要使用一种 C 语言的数据类型表示这些人 物,结构体无疑是最佳选择。下面用一个名为 hero 的结构体来表示:
struct hero {
int number; char sex; char star_name[20]; char name[20]; char nickname[20]; char position[20]; char weapon[20]; };
C语言第11章结构体
![C语言第11章结构体](https://img.taocdn.com/s3/m/57cfe33a31126edb6f1a10ca.png)
29
【例】30张选票,对三名侯选人之一投票选举,输 入得票人名字,按名字计数,输出最后选举结果。 #include "stdio.h" #define N 30 struct person { char name[20]; int count; };
Li
0 Zhang 0 Wang 0
led[0].name
第十一章 结构体与பைடு நூலகம்用体
本章目标
1.理解结构体,共用体的数据类型
2.学会定义结构体、共用体的数据类型 的变量 3.能够正确使用结构体、共用体的成员
§11.1
已了解的数据类型:
引言
整型 浮点型 字符型 数组
简单数据类型
用户定义的数据类型
特点:所有的元素都是同一种类型
指针型 存在的问题:难以处理较复杂的数据
18
圆点运算符
引用形式:结构体变量名 . 成员名 其中:成员运算符’ . ‟ : 一级,自左而右;
stu1.num 引用结构体变量stu1的num成员; 引用stu1的name成员(字符指针); [i] 引用name成员的第i个元素; stu1.birthday.y 只能对最低级成员进行引用;
二、定义完结构体后,定义结构变量并初始化 struct student x2={0002, "Li Ming ", 85.5};
16
§11.4 访问结构成员
访问结构变量实质上是引用其成员 有两种运算符可访问结构成员
17
struct date { int m; int d; iny y; }; struct student { long num; char name[20]; char sex; struct date birthday; float score; char tel[15]; } stu1, stu2;
零基础入门学习C语言课件第十章 结构体与共用体06
![零基础入门学习C语言课件第十章 结构体与共用体06](https://img.taocdn.com/s3/m/48c935374693daef5ff73d2d.png)
或者为:
enum weekday{ sun,mou,tue,wed,thu,fri,sat }a, b, c;
或者为:
enum { sun,mou,tue,wed,thu,fri,sat }a, b, c;
共用体变量的引用方式
只有先定义了共用体变量才能引用它,而且不 能引用共用体变量,而只能引用共用体变量中 的成员。
例如:前面定义了a、b、c为共用体变量
a.i (引用共用体变量中的整型变量i) a.ch(引用共用体变量中的字符变量ch) a.f (引用共用体变量中的实型变量f)
共用体类型数据的特点
不能把共用体变量作为函数参数,也不能使函 数带回共用体变量,但可以使用指向共用体变 量的指针
共用体类型可以出现在结构体类型定义中,也 可以定义共用体数组。反之,结构体也可以出 现在共用体类型定义中,数组也可以作为共用 体的成员。
应用情况
设有若干个人员的数据,其中有学生和教师。 学生的数据中包括:姓名、号码、性别、职 业、班级。教师的数据包括:姓名、号码、 性别、职业、职务。可以看出,学生和教师 所包含的数据是不同的。现要求把它们放在 同一表格中。
float f;
}a,b,c;
};
union data a,b,c;
共用体和结构体的比较:
结构体变量所占内存长度是各成员占的内存 长度之和。每个成员分别占有其自己的内存 单元。
共用体变量所占的内存长度等于最长的成员 的长度。
例如: 上面定义的“共用体”变量a、b、c各 占4个字节(因为一个实/整型变量占4个字 节),而不是各占4+1+4=7个字节。
C程序设计(第四版)第7章结构体与共用体
![C程序设计(第四版)第7章结构体与共用体](https://img.taocdn.com/s3/m/ac9c30a6dd3383c4ba4cd202.png)
7.1.1
结构体类型的定义
结构体在说明和使用之前,必须先由用 户自己定义。结构体定义的一般形式如下: struct 结构体名 { 成员类型说明符 成员项1; 成员类型说明符 成员项2; …… 成员类型说明符 成员项n; };
其中: 1、struct是C语言中定义结构体的关键字。 2、成员类型说明符是说明每个成员项的数 据类型,可以是基本数据类型,也可以是数组 类型,还可以是另一个已定义的结构体类型。 3、成员名可以和程序中的变量名相同,两 者不代表同一对象。 4、要注意,在结构体定义中的右括号后应 该有分号。
7.1.6
指向结构体的指针
一个结构体类型的数据在内存中都占据一定 的存储空间,我们可以定义一个指针来指向该 结构体类型的数据,该指针变量称为指向结构 体的指针,简称之为结构体指针。我们可以通 过结构体指针来访问结构体类型的数据,如结 构体变量、结构体数组。指向结构体的指针变 量说明形式如下: struct 结构体类型名 *结构体指针变量名;
main() { struct student stu1; struct student *p; p=&stu1; stu1.num=50201001; gets(); stu1.score=89.5;
printf(“No:%ld\nName:%s\nScore:%4.1f\n”,stu1 .num,,stu1.score); printf(“No:%ld\nName:%s\nScore:%4.1f\n”,(*p). num,(*p).name,(*p).score);
3、结构体数组应用举例 【例7-2】现有三个候选人(每个候选人的ID 号分别是1、2、3),选举人投票进行选举, 编写程序统计出每个候选人的得票结果。 程序如下: #define NUM 30 #include <stdio.h> struct elector { int id; char name[20]; int count;
浅谈C语言共用体和与结构体的区别
![浅谈C语言共用体和与结构体的区别](https://img.taocdn.com/s3/m/9c416cf9162ded630b1c59eef8c75fbfc77d94c8.png)
浅谈C语⾔共⽤体和与结构体的区别
共⽤体与结构体的区别
共⽤体:
使⽤union 关键字
共⽤体内存长度是内部最长的数据类型的长度。
共⽤体的地址和内部各成员变量的地址都是同⼀个地址
结构体⼤⼩:
结构体内部的成员,⼤⼩等于最后⼀个成员的偏移量+最后⼀个成员⼤⼩+末尾的填充字节数。
结构体的偏移量:某⼀个成员的实际地址和结构体⾸地址之间的距离。
结构体字节对齐:每个成员相对于结构体⾸地址的偏移量都得是当前成员所占内存⼤⼩的整数倍,如果不是会在成员前⾯加填充字节。
结构体的⼤⼩是内部最宽的成员的整数倍。
共⽤体
#include <stdio.h>
//gcc让不同类型的变量共享内存地址 ,同⼀时间只有⼀个成员有效
union data{
int a;
char b;
int c;
};
int main(){
union data data_1 = {1};//初始化时只填写⼀个值。
(同⼀时间只有⼀个成员有效)
data_1.b = 'c';
data_1.a = 10;//后赋值的才有效。
前⾯的赋值被覆盖
//打印地址,发现指向同⼀个地址
printf("%p\n%p\n%p\n",&data_1.a,&data_1.a,&data_1.a);
return 0;
}
以上这篇浅谈C语⾔共⽤体和与结构体的区别就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
C语言程序设计 - 结构体和共用体-样本教案
![C语言程序设计 - 结构体和共用体-样本教案](https://img.taocdn.com/s3/m/38ae5cf9f705cc1755270980.png)
用以下实例来分析:
struct
{int a;
int *s;
}*p;
第一组引用:对成员变量a的引用
++p->a++(p->a)
说明:成员变量a自增加1.
(++p)->a
说明:指针p先移动一个单位,然后引用对应的成员变量a.
注意: p每移动一个单位要移动多少字节?
格式一:先说明结构类型,再单独进行结构变量定义.
例:
struct student
{ char name[12];
char sex;
sturct date birthday;
float sc[4];
};
struct student std,pers[3],*pstd;
说明:这个例子定义了三个结构类型名为student的结构变量:
这种结构类型变量定义的方式与不省略"结构名"的方式相比,不同之处在于:这种格式定义结构变量以后无法再定义此结构类型的其它结构变量,而带有"结构名"的格式则可以.
格式三:使用typedef说明一个结构类型名,再用新类型名定义结构变量.
例:
typedefstruct
{ char name[12];
char sex;
{"Wang wu" , "F",1983, 3, 3,93,83,73,63}
};
有时结构数组长度可以省略,而由初值个数来暗示.
(4)结构变量成员的引用和操作:
1)对结构变量成员的引用和操作:
C语言中的结构体和共用体(联合体)
![C语言中的结构体和共用体(联合体)](https://img.taocdn.com/s3/m/0cdafad30408763231126edb6f1aff00bed570db.png)
C语言中的结构体和共用体(联合体)/c-pointer-array/在C 语言中,结构体(struct)是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。
由于结构体将一组相关变量看作一个单元而不是各自独立的实体,因此结构体有助于组织复杂的数据,特别是在大型的程序中。
共用体(union),也称为联合体,是用于(在不同时刻)保存不同类型和长度的变量,它提供了一种方式,以在单块存储区中管理不同类型的数据。
今天,我们来介绍一下C 语言中结构体和共用体的相关概念和使用。
结构体 / struct结构体的定义声明一个结构体类型的一般形式为:struct 结构体名 {成员列表};其中,成员列表中对各成员都应进行类型声明,即:类型名成员名;例如,我们需要在程序中记录一个学生(student)的数据,包括学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)、地址(addr)等,如下图所示:如果要表示图中的数据结构,但C 语言并没有提供这种现成的数据类型,因此我们需要用定义一种结构体类型来表示。
truct student {int num;char name[20];char sex;int age;float score;char addr[30];};上述定义了一个新的结构体类型 struct student(注意,struct 是声明结构体类型时所必须使用的关键及,不能省略),它向编译系统声明,这是一个“结构体类型”,它包括 num、name、sex、age、score、addr 等不同类型的数据项。
应当说,这里的 struct student 是一个类型名,它与系统提供的标准类型(如 int、char、float、double 等)具有同样的作用,都可以用来定义变量的类型。
结构体变量前面只是声明了一个结构体类型,它相当于一个模型,但其中并无具体的数据,编译系统对其也不分配实际的内存单元。
C语言第12讲 结构体共用体
![C语言第12讲 结构体共用体](https://img.taocdn.com/s3/m/443d65543b3567ec102d8a85.png)
§6.3 结构体变量的引用
引用规则
结构体变量不能整体引用,只能引用变量成员
引用方式: 结构体变量名.成员名
例 struct 成员(分量)运算符 student 可以将一个结构体变量赋值给另一个结构体变量 例 struct student { stu1.num=10; int num; 优先级: 结构体嵌套时逐级引用 1 { int num; 例 struct student 结合性:从左向右 { char name[20]; int num; 例 struct name[20]; char sex; char student char name[20]; stu1.score=85.5; 例 structchar num; student { int sex; int char sex; age; printf(“%d,%s,%c,%d,%f,%s\n”,stu1); () if(stu1==stu2) { int age; num; stu1.birthday.month=12; char name[20]; float score; int …….. () stu1.score+=stu2.score; char score; name[20]; int age; struct float date char addr[30]; stu1.age++; float score; char addr[30]; stu1={101,“Wan Lin”,„M‟,19,87.5,“DaLian”}; () sex; { int char month; }stu1,stu2; addr[30]; char birthday int age; int }stu1,stu2; day; num name float score; }stu1,stu2; month day year int year; stu2=stu1; ( ) char addr[30]; }birthday; }stu1,stu2; }stu1,stu2;
C语言中的结构体及共用体
![C语言中的结构体及共用体](https://img.taocdn.com/s3/m/b9e4d37eb94ae45c3b3567ec102de2bd9705de55.png)
C语⾔中的结构体及共⽤体C语⾔中的结构体、共⽤体以及枚举类型⼀、结构体1、概述 为什么需要结构体? 在实际问题中,⼀组数据可能包含多种数据类型,⽐如描述⼀名学⽣时,需要⽤char类型的姓名,char或者int数据类型的学号,float类型的分数,等等, 结构体可以有效的解决这类问题。
实质 结构体本质上还是⼀种数据类型,它包含若⼲个“成员”,每个成员可以是不同数据类型的,基本数据类型或者构造数据类型。
结构体有利于程序的阅读 理解和移植,⽽且结构体的存储⽅式可以提⾼CPU对内存的访问速度。
定义结构体的⼀般形式: struct 结构名 { 成员列表 }; 成员列表由若⼲个成员组成,都是该结构体的组成部分,对于每个成员都需要进⾏类型说明,其形式为:类型说明符成员名2、定义结构体变量 (1)先声明结构体类型再定义变量名 struct student student1,student2; (2)在声明结构体类型时同时定义变量 这种形式的定义的⼀般形式为: struct 结构体名 { 成员列表 }变量名表列; (3)直接定义结构体类型变量 ⼀般形式为 struct { 成员表列 }变量名表列; //结构体名是可有可⽆的3、结构体变量的引⽤ ##注意: (1)不能将⼀个结构体变量作为⼀个整体进⾏输⼊输出。
(2)如果成员本⾝也是⼀个结构体类型,则需要使⽤成员运算符⼀级⼀级地找到最低⼀级的成员。
(3)结构体变量的成员⼀样可以像普通变量进⾏各种运算。
引⽤结构体变量中的成员的⽅式为: 结构体变量名.成员名 由上⾯形式可以直接对结构体变量中的成员进⾏赋值。
4、结构体变量的初始化 struct 结构体名 { 成员表列 }结构体变量1,结构体变量2 = {...}; 结构体变量1 = {... };5、结构体数组 概念:即数组的每个元素都是结构体类型。
struct 结构体名 { 成员表列 }数组名[]; 或者struct 结构体名数组名[] ; 初始化:数组名[] = { ...};6、指向结构体类型数据的指针 概念:结构体变量的指针就是该结构体变量所占据的内存段的起始地址。
C语言第11讲--结构体和共用体
![C语言第11讲--结构体和共用体](https://img.taocdn.com/s3/m/7406558dd0d233d4b14e6992.png)
如:方式(2) 方式 struct student int score[4];}
{long num;char name[20];
结构体数组初始化
a[3]={{20030001,"zhang",89,90,91,92}, {20030002,"liu",68,69,70,71}, {20030003,"li",57,58,59,60} };
第十三讲 特殊数据类型
—— 结构体、共用体、 结构体、共用体、 枚举类型、 枚举类型、自定义类型
§11.1 结构体和共用体概述
数组可以存放一组相关的同类型数据, 数组可以存放一组相关的同类型数据,但是 一组相关的同类型数据 不能将不同类型的数据放入同一数组中。 不能将不同类型的数据放入同一数组中。 如果需要把一个学生的学号、姓名、性别、 如果需要把一个学生的学号、姓名、性别、 年龄、各门功课的考试成绩等不同类型的数 年龄、各门功课的考试成绩等不同类型的数 放在一个构造型数据类型中, 据放在一个构造型数据类型中,就需要另外 一种新的数据类型: 一种新的数据类型:结构体类型或者共用体 类型数据 数据。 类型数据。 一个结构体类型的变量中可以独立存放多种 类型的数据,一个共用体 共用体类型的变量中可以 类型的数据,一个共用体类型的变量中可以 共用同一段存储单元来存放不同类型的数据 来存放不同类型的数据。 共用同一段存储单元来存放不同类型的数据。
4
三、对结构体类型的说明
结构体类型与结构体类型变量是两个概念, 结构体类型与结构体类型变量是两个概念, 应区分结构体名与变量名。 应区分结构体名与变量名。 成员也可以是一个结构体变量。 成员也可以是一个结构体变量。
C语言学习入门笔记之结构体与共用体
![C语言学习入门笔记之结构体与共用体](https://img.taocdn.com/s3/m/9bd9e8e1f605cc1755270722192e453610665b77.png)
结构体与共用体笔记定义结构体C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。
在其他一些高级语言中称为“记录”.定义后的结构体类型和系统提供的标准类型(如int, char, float, double 等)具有相似的作用,都可以用来定义变量,只不过int等类型是系统已声明的,而结构体类型是由用户根据需要在程序中指定的。
定义一个结构体类型的一般形式为:struct 结构体名{ 成员表列};注意:1.结构体类型的名字是由一个关键字struct和结构体名组合而成的(例如struct Student) ,结构体名是由用户指定的,又称“结构体标记”,以区别于其他结构体类型。
上面的结构体声明中Student就是结构体名(结构体标记)。
2.花括号内是该结构体所包括的子项,称为结构体的成员。
“成员表列"(member list)也称为“域表”(field list),成员表列由若干个成员组成,每一个成员是结构体中的一个域。
对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。
例如:struct stu{int num;char name[20];char sex;float score;};3.一个结构体的成员可以属于另一个结构体类型(嵌套)。
例如:struct Date //声明一个结构体类型struct Date{ int month;//月int day;//日int year;//年}struct Student//声明一个结构体类型struct Student{ int num;char name[20];char sex;int age;struct Date birthday;//成员birthday属于struct Date 类型char addr[30];};结构体类型变量1.定义结构体类型变量说明结构变量有以下三种方法。
C语言11结构体与共用体
![C语言11结构体与共用体](https://img.taocdn.com/s3/m/4c0b679a3186bceb18e8bb1e.png)
struct [结构体名]
{
类类结述…型 型结构…不标 标构体…分识 识的类…配符 符组型…内织定.存成 成形义员员式描名名;;
};2020/5/11
struct student { char name[20];
unsigned int nuloat score[3]; }; 3
} 2020/5/11 stu;
7
• 结构体变量的初始化
struct 结构体名
{ 类型标识符 成员名;
struc类t 型stu标de识nt符 成员名; { in…t n…u…m;……. }; char name[20]; strucctha结r 构sex体; 名 结构体变量={初始数据};
int age; strucctha结r a构dd体r[名30]; }{;stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”}; struc类t 型stu标de识nt符stu成1=员{11名2,;“Wang Lin”,‘M’,19, “200 Beijing Road”};
类型标识符 成员名;
……………. } 结构体变量={初始数据};
2020/5/11
8
• 结构体数组的定义和内存分配
形式一:
形式二:
struct student
struct student
{ int num;
{ int num;
char name[20];
char name[20];
char sex;
stu[1]
main()
age
{ struct student *p;
num
for(p=stu; p<stu+3; p++)
C语言程序设计——结构体和共用体(完整版)
![C语言程序设计——结构体和共用体(完整版)](https://img.taocdn.com/s3/m/ce874ede84254b35eefd349d.png)
printf(“name\tage\tjob\tclass/office\n”); for(i=0;i<PN;i++) {if(body[i].job==„s‟) printf(“%s\t%d\t%3c\t%d\n”,body[i].name, body[i].age,body[i].job,body[i].units.class); else printf(“%s\t%d\t%3c\t%s\n”,body[i].name, body[i].age,body[i].job,body[i].units.office); } }
birthday num name sex age month day year addr
§12.3结构体数组
结构体数组的每一个元素都是具有相同结构类型 的结构体变量。 例:struct student {int num; char name[20]; float score; }stu[3]; 其中,定义了一个结构体数组stu,共有3个元素, 每个元素都具有struct student的结构形式。
§12.6共用体
共用体(也称为联合)也是一种构造的数据类型。 共用体是将不同类型的数据组织在一起共同占用 同一段内存的一种构造数据类型。 例如,在校学生和教师都填写以下表格: 姓名 年龄 职业 单位 其中,职业分两类:教师和学生; 而单位一栏里,学生填写班级编号(整型类型), 教师填写某系某教研室(整型类型) 。
§12.7枚举数据类型
当某些变量仅由有限个数据值组成时,通常用枚 举类型来表示。 所谓枚举是指将变量的值一一列举出来,变量的 值只限于列举出来的值的范围内。如一周只有7天, 一年只有12个月等等。
注意:枚举类型是一种基本数据类型,而不是一 种构造类型。关键字为enum。
c语言第11章-结构体与共用体
![c语言第11章-结构体与共用体](https://img.taocdn.com/s3/m/f3a39a14c950ad02de80d4d8d15abe23482f0330.png)
}
§11.6 构造体和指针
ma指in向() 构造体变量旳指针
{ s❖tr定uc义t st形ud式en:t struct 构造体名 *构造体指针名; { 例lonsgtruicntt sntuudmen;t *p; char name[20]; ❖使str用ucch构tars造tsued体xe;n指t 针变存量储引构用造组体p员变形量式在内存旳起始地址
struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Roa
形式二:
struct 构造体名
{ 类型标识符 组员名; 类型标识符 组员名;
……………. }构造体变量={初始数据};
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”
❖用构造体变量旳组员作参数----值传递 ❖用指向构造体变量或数组旳指针作参数----地址传递 ❖用构造体变量作参数----多值传递,效率低
例 用构造体变量作函数参数
(main)
struct data { int a, b, c; };
accacbbb::::::::2332333370070
main()
}
指向构造体数组旳指针
例 指向构造体数组旳指针
struct student { int num;
char name[20]; char sex; int age;
p num
name
sex
p+1
age
四川大学《c语言程序设计》课件-第8章 结构体与共用体
![四川大学《c语言程序设计》课件-第8章 结构体与共用体](https://img.taocdn.com/s3/m/192b5300ae45b307e87101f69e3143323968f535.png)
90 83 72 82
2 林平之
男 1999
78 92 88 78
3 岳灵珊
女 1999
89 72 98 66
4 任盈盈
女 1999
78 95 87 90
结构体的解决方法
struct STUDENT
{ int studentID;
/*每个学生的序号*/
char studentName[10];/*每个学生的姓名*/
};
结构体变量的指针
struct STUDENT
{
int
studentID;
char
studentName[10];
char
studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
int
scoreMath;
int
结构体的内存占用
double 占用内存字节数 = 8 struct 类型用内存字节数 = ? 是所有成员变量的内存总和吗?
用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型)
struct number
{ short i; char ch;
float f;
};
printf("%d\n", sizeof(struct number));
struct STUDENT *pStu; /*定义结构体指针*/
pStu = &stu;
通过stu和成员运算符访问结构体成员
– stu. studentID = 1;
通过pStu和指向运算符访问结构体成员
C语言程序设计 Chapter8 结构体与共用体
![C语言程序设计 Chapter8 结构体与共用体](https://img.taocdn.com/s3/m/d69ea0c2d5bbfd0a7956735c.png)
struct date_type { int year; 结构体数组 int month; int day; 结构体数组的定义 }; ; struct stud_type { char name[10]; long num; char sex; struct date_type birthday; float score; char address[10]; }s1[3]; struct stud_type s2[5];
struct ym_type { 输入一个职工的工资信息, 例. 输入一个职工的工资信息,整体 int y; 赋值给另一个变量,在屏幕上输出。 赋值给另一个变量,在屏幕上输出。 int m; }; struct salary_type { char num[5]; char name[17]; struct ym_type ym; float salary; float other; float cost; };
#define N 5
char name[11]; int score; }t,s[N]; main() { /*输入基本信息 输入基本信息*/ 输入基本信息 /*选择排序成绩 选择排序成绩*/ 选择排序成绩 /*输出基本信息 输出基本信息*/ 输出基本信息 }
/*选择排序成绩 选择排序成绩*/ 选择排序成绩 for(i=0;i<N-1;i++) { k=i; for(j=i+1;j<N;j++) if(s[k].score<s[j].score) k=j; if(k!=i) { t=s[i]; s[i]=s[k]; s[k]=t; } }
第8章 结构体与共用体
概述
在事务处理中,常需要将一些关系密切但 在事务处理中 常需要将一些关系密切但类型不同的 并为其取一个整体名字, 数据项组织在一起,并为其取一个整体名字,形成一 并为其取一个整体名字 个结构。 语言中,就称其为 个结构。 语言中 就称其为结构体。 C语言中 结构体通常由不同数据类型的数据项(成员)组成 组成 一个结构体可包含若干成员,每个成员具有自己 一个结构体可包含若干成员 每个成员具有自己 的名字及数据类型。 的名字及数据类型。
c语言结构体共用体数据类型求大小例题
![c语言结构体共用体数据类型求大小例题](https://img.taocdn.com/s3/m/014f561d302b3169a45177232f60ddccda38e68d.png)
c语言结构体共用体数据类型求大小例题C语言中的结构体和共用体是非常重要的数据类型,它们能够帮助程序员更好地组织和管理数据。
在本文中,我将为你详细介绍C语言中结构体和共用体的特点、用法及例题。
一、结构体的定义和特点1. 结构体是什么?在C语言中,结构体是一种用户自定义的数据类型,它可以包含不同类型的数据,用于表示和管理复杂的数据结构。
结构体的定义以关键字struct开头,后面跟着结构体的名称和大括号内包含的成员变量列表。
2. 结构体的特点结构体的成员变量可以是不同的数据类型,包括基本数据类型、指针类型和其他结构体类型。
这使得结构体非常适合用于表示复杂的数据结构,如学生信息、员工信息等。
二、共用体的定义和特点1. 共用体是什么?共用体也是C语言中的一种用户自定义数据类型,它与结构体类似,不同的是共用体的成员变量共享同一块内存空间。
这意味着共用体的所有成员变量使用同一块内存,修改一个成员变量会影响其他成员变量。
2. 共用体的特点共用体的成员变量共享同一块内存空间,因此共用体非常节省内存。
但也正是由于这种特点,使用共用体需要特别小心,避免出现数据混淆和错误。
三、结构体和共用体的例题为了更好地理解结构体和共用体的用法,我们来看一个例题:如何计算结构体和共用体的大小?```c#include <stdio.h>// 定义一个结构体struct Student {char name[20];int age;float score;};// 定义一个共用体union Data {int num;char str[20];};int main() {// 计算结构体的大小printf("Size of struct Student: %lu bytes\n", sizeof(struct Student));// 计算共用体的大小printf("Size of union Data: %lu bytes\n", sizeof(union Data));return 0;}```在这个例题中,我们定义了一个学生结构体和一个数据共用体,并在主函数中分别计算了它们的大小。
C语言:结构体和联合体(共用体)
![C语言:结构体和联合体(共用体)](https://img.taocdn.com/s3/m/b9a3dcc148649b6648d7c1c708a1284ac8500566.png)
C语⾔:结构体和联合体(共⽤体)
结构体:struct
1、结构体变量的⾸地址能够被其最宽基本类型成员的⼤⼩所整除。
2、结构体每个成员相对于结构体⾸地址的偏移量(offset)都是成员的整数倍。
3、结构体的总⼤⼩为结构体最宽基本类型成员⼤⼩的整数倍。
cpu的字长:
32位的cpu或64位的cpu
32位或64位指的是cpu的字长
字长实际上指得是cpu在访问内存时,⼀次可以读取的长度。
内存对齐(可以设置,⼀般是2的倍数,虽然浪费了空间,但是⽅便了cpu更好更快的取出数据):
char 4个字节
int 4个字节
int 8个字节
double 8个字节
联合体(共⽤体):union
1、所有的属性成员都共同相同的⼀块内存空间,⽽这个空间⼤⼩取⾃最⼤属性成员的⼤⼩。
属性成员在依次存值时,会产⽣覆盖。
2、联合变量的定义和初始化,使⽤第⼀个数据成员做初始化,{}不能省略。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)“结构类型名”和“数据项”的命名规则,与变量 名相同。 (2)数据类型相同的数据项,既可逐个、逐行分别定义, 也可合并成一行定义。 例如,上例中的日期结构类型,也可改为如下形式: struct date {int year, month, day; }; (3)结构类型中的数据项,既可以是基本数据类型,也 允许是另一个已经定义的结构类型。 例如,上例中的结构类型std_info,其数据项“birthday” 就是一个已经定义的日期结构类型date。 (4)本书将1个数据项称为结构类型的1个成员(或分 量)。
/*主函数main()*/ main() { int i; /* 打 印 表 头 : " □" 表 示 1 个 空 格 字 符 * / printf("No.□□□□Name□□□□□Sex□Birthday\n"); /*输出三个学生的基本情况*/ for(i=0; i<3; i++) { printf("%-7s",student[i].no); printf("%-9s",student[i].name); printf("%-4s",student[i].sex); printf("%d-%d-%d\n",student[i].birthday.year, student[i].birthday.month, student[i].birthday.day); } }
11.2
定义结构体类型变量的方法
声明一个结构体类型的一般形式: struct 结构类型名 /* struct是结构类型关键字*/ {数据类型 数据项1; 数据类型 数据项2; …… …… 数据类型 数据项n; }; /* 此行分号不能少!*/
如:定义一个反映学生基本情况的结构类型,用以存储 学生的相关信息。 /*功能:定义一个反映学生基本情况的结构类型*/
/*打印内容*/ for( ; i<3; i++) { display( student + i ); printf("\n"); } } void display(struct std_info *p_std) { printf("%-7s%-9s%-4s", p_std->no, p_std->name, p_std->sex); printf("%4d-%2d-%2d\n", p_std->birthday.year, p_std->birthday.month, p_std->birthday.day); }
通过指向结构体变量的指针来访问结构体变量的成 员,与直接使用结构体变量的效果一样。一般地说, 如果指针变量pointer已指向结构体变量var,则以下 三种形式等价:
(1)var.成员 (2)pointer->成员 (3)(*pointer).成员 省!*/
/* “*pointer”外面的括号不能
程序运行结果: No. Name 000102 张三 000105 李四 000112 王五
Sex 男 男 女
Birthday 1980-9-20 1980-8-15 1980-3-10
与结构变量的定义相似,结构数组的定义也 分直接定义和间接定义两种方法,只需说明为 数组即可。
11.5.2
结构体数组的初始化
3、直接定义结构体类型变量 其一般形式为: struct { 成员表列 } 变量名表列; 即不出现结构体名。 说明: (1)结构类型与结构变量是两个不同的概念,其区 别如同int类型与int型变量的区别一样。 (2)结构类型中的成员名,可以与程序中的变量同 名,它们代表不同的对象,互不干扰。
11.3
如果某成员本身又是一个结构类型,则只能通过 多级的分量运算,对最低一级的成员进行引用。 此时的引用格式扩展为: 结构变量.成员.子成员.….最低1级子成员 例如,引用结构变量student中的birthday成员 的格式分别为: student.birthday.year student.birthday.month student.birthday.day (1)对最低一级成员,可像同类型的普通变量 一样,进行相应的各种运算。 (2)既可引用结构变量成员的地址,也可引用 结构变量的地址。例如,& ,&student 。
注意: 如果指针变量p已指向某结构体数组,则 p+1指向结构体数组的下一个元素,而不是 当前元素的下一个成员。 另外,如果指针变量p已经指向一个结某一 成员。
11.6.3 用结构体变量和指向结构体的指针作函 数参数
[例] 用函数调用方式,改写上例:编写一个专门的显 示函数display(),通过主函数调用来实现显示。
#include "struct.h" /*定义并初始化一个外部结构数组student */ struct std_info student[3]={{"000102","张三","男",{1980,5,20}}, {"000105","李四","男",{1980,8,15}}, {“000112”,“ 王 五”,“女”,{1980,3,10}} }; /*主函数main()*/ main() { void display(); /*函数说明*/ int i=0; /*打印表头*/ printf("No.□□□□Name□□□□□Sex□Birthday\n");
注意:在格式(1)中,分量运算符左侧的运算对 象,只能是结构体变量;而在格式(2)中,指向运算 符左侧的运算对象,只能是指向结构体变量(或结构 体数组)的指针变量,否则都出错。
思考题:如果要求从键盘上输入结构体变量student的各成 员数据,如何修改程序?
11.6.2 指向结构体数组的指针
[例]使用指向结构体数组的指针来访问结构体数组。
结构变量的引用
#include“struct.h” /*定义并初始化一个外部结构变量student */ struct std_info student={“000102”,“张 三”,“男”,{1980,9,20}}; main() { printf("No: %s\n",student.no); printf("Name: %s\n",); printf("Sex: %s\n",student.sex); printf("Birthday: %d-%d-%d\n",student.birthday.year, student.birthday.month, student.birthday.day); }
与普通数组一样,结构数组也可在定义时进行初始化。 初始化的格式为: 结构数组[n]={{初值表1},{初值表2},...,{初值 表n}} 例如,上例中的结构数组student[3]。 11.5.3 结构体数组应用举例 请同学看教材287页的例子。
11.6
11.6.1
指向结构体类型数据的指针
指向结构体变量的指针
11.4
结构体变量的初始化
结构体变量初始化的格式,与一维数组相似: 结构变量={初值表} 不同的是:如果某成员本身又是结构类型,则 该成员的初值为一个初值表。 如上例中的
student={“000102”,“张三”,“男”,{1980,9,20}};
注意:初值的数据类型,应与结构变量中相应
成员所要求的一致,否则会出错。
结构变量在内存中的起始地址称为结构变量的指针。 [例] 使用指向结构变量的指针来访问结构变量的各个成员。 #include“struct.h” struct std_info student={“000102”,“张三”,“男”,{1980,9,20}}; main() { struct std_info *p_std=&student; printf("No: %s\n", p_std->no); printf("Name: %s\n", p_std->name); printf("Sex: %s\n", p_std->sex); printf("Birthday: %d-%d-%d\n", p_std->birthday.year, p_std->birthday.month, p_std->birthday.day); }
11.5
结构体数组
结构数组的每一个元素,都是结构类型数据,均包含 结构类型的所有成员。
11.5.1 定义结构体数组
上例中定义的结构类型struct std_info,定义一个结构 数组student,用于存储和显示三个学生的基本情况。
#include"struct.h" /*定义并初始化一个外部结构数组student[3] */ struct std_info student[3]={{“000102”,“张三”,“男”,{1980,9,20}}, {“000105”,“李四”,“男”,{1980,8,15}}, {“000112”,“王五”,“女”,{1980,3,10}} };
程序运行结果: No: 000102 Name: 张三 Sex: 男 Birthday:1980-9-20
结构变量的引用规则: 对于结构变量,要通过成员运算符“.”,逐个访 问其成员,且访问的格式为: 结构变量.成员 /*其中的“.”是成员运算符*/ 例如上例中的student.no,引用结构变量student 中的no成员;引用结构变量student中 的name成员;等等。
#include “struct.h“ /*定义并初始化一个外部结构体数组student */ struct std_info student[3]={{"000102","张三","男",{1980,5,20}}, {"000105","李四","男",{1980,8,15}}, {“000112”,“王五”,“女”,{1980,3,10}} }; main() { struct std_info *p_std=student; int i=0; /*打印表头*/ printf("No.□□□□Name□□□□□Sex□Birthday\n"); /*输出结构数组内容*/ for( ; i<3; i++, p_std++) { printf("%-7s%-9s%-4s", p_std->no, p_std->name, p_std->sex); printf("%4d-%2d-%2d\n", p_std->birthday.year, p_std->birthday.month, p_std->birthday.day); } }