C语言-结构体与共用体
《C语言参悟之旅》第九章 结构体 共用体

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章结构体

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

或者为:
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章结构体与共用体

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语⾔共⽤体和与结构体的区别
共⽤体与结构体的区别
共⽤体:
使⽤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语言程序设计 - 结构体和共用体-样本教案

用以下实例来分析:
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语言中的结构体和共用体(联合体)/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讲 结构体共用体
§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语⾔中的结构体及共⽤体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讲--结构体和共用体
如:方式(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
三、对结构体类型的说明
结构体类型与结构体类型变量是两个概念, 结构体类型与结构体类型变量是两个概念, 应区分结构体名与变量名。 应区分结构体名与变量名。 成员也可以是一个结构体变量。 成员也可以是一个结构体变量。
- 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); } }