C语言-ch11结构体和共用体
C语言程序设计第十一章 结构体与共用体

11 结构体与共用体 (1)11.1 定义一个结构的一般形式 (1)11.2 结构类型变量的说明 (2)11.3 结构变量成员的表示方法 (4)11.4 结构变量的赋值 (4)11.5 结构变量的初始化 (5)11.6 结构数组的定义 (5)11.7 结构指针变量的说明和使用 (7)11.7.1 指向结构变量的指针 (7)11.7.2 指向结构数组的指针 (9)11.7.3 结构指针变量作函数参数 (10)11.8 动态存储分配 (11)11.9 链表的概念 (12)11.10 枚举类型 (14)11.10.1 枚举类型的定义和枚举变量的说明 (14)11.10.2 枚举类型变量的赋值和使用 (15)11.11 类型定义符typedef (16)11 结构体与共用体11.1 定义一个结构的一般形式在实际问题中,一组数据往往具有不同的数据类型。
例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。
显然不能用一个数组来存放这一组数据。
因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。
为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。
它相当于其它高级语言中的记录。
“结构”是一种构造类型,它是由若干“成员”组成的。
每一个成员可以是一个基本数据类型或者又是一个构造类型。
结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。
如同在说明和调用函数之前要先定义函数一样。
定义一个结构的一般形式为:struct 结构名{成员表列};成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。
对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。
例如:struct stu{int num;char name[20];char sex;float score;};在这个结构定义中,结构名为stu,该结构由4个成员组成。
浅谈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程序设计 第十一章 结构体与共用体

11.2 定义结构体类型变量的方法
• 4、对结构体中的成员,可以单独使用,他的作用与地位 • 相当于普通变量。
11.3 结构体变量的引用
• • • • • • • • • • • 引用形式: 结构体变量名.成员名 规则: 1、不能将结构体变量作为一个整体进行赋值、输入和输 出,只能对结构体中的各个成员分别进行;但允许将一个 结构体变量直接赋值给另一个具有相同结构的结构体变 量。 如: student1.num=10010; student1=student2; 2、如果成员本身又属一个结构体类型,则要用若干个成 员运算符,一级一级地找到最低的一级的成员。只能对最 低级的成员进行赋值或存取以及运算。 如:student1.num student1.birthday.month
11.6 指向结构体类型数据的指针
• • • • • • • • • • • • • • 试分析以下几种运算: p -> n p -> n++ ++ p -> n 例11.3 指向结构体变量的指针的应用 #include<stdio.h> #include<string.h> void main( ) { struct student { long num; char name[20]; char sex; float score; };
11.5 结构体数组
• • • • • • • • • 例10.2 候选人得票的统计程序。设三个候选人,每次输 入一个得票的候选人的名字,要求最后输出候选人的得票 结果。 #include<stdio.h> #include<string.h> struct person { char name[20]; int count; } leader[3]={“Li”, 0, “Zhang”, 0, “wang”, 0};
C语言教程之结构体共用体与位运算

C语言教程之结构体共用体与位运算C语言是一种功能强大的编程语言,它提供了许多用于处理复杂数据类型的特性。
其中,结构体、共用体和位运算是三个重要的特性,可以帮助开发者更高效地处理数据。
本教程将介绍C语言中的结构体、共用体和位运算,并给出一些实例和使用场景。
1. 结构体(Structures)结构体是C语言中一种用户自定义的数据类型,可以将不同类型的数据组合在一起,形成一个新的复合数据类型。
结构体通过关键字"struct"来定义,可以在其中定义多个成员变量,并且可以根据需要为每个成员变量指定不同的数据类型。
例如,我们可以定义一个结构体来表示一个学生的信息:```struct studentchar name[20];int age;float grade;};```上面的代码定义了一个名为`student`的结构体,包含了三个成员变量:`name`,`age`和`grade`,分别表示学生的姓名、年龄和成绩。
使用结构体时,可以通过`.`操作符来访问结构体的成员变量,就像访问一个普通的变量一样。
例如,我们可以通过以下方式给结构体的成员变量赋值:```struct student stu1;strcpy(, "John");stu1.age = 18;stu1.grade = 90.5;```2. 共用体(Unions)共用体是C语言中一种特殊的数据类型,它和结构体类似,也可以包含多个成员变量,不同之处在于,共用体的成员变量共享同一块内存空间。
即,共用体的所有成员变量在内存中的起始地址是相同的,它们共同占用一段连续的内存空间。
共用体的定义方式与结构体类似,只是将关键字"struct"换成了"union"。
例如,我们可以定义一个共用体来表示一个变量的多种不同数据类型的解释:```union dataint i;float f;char str[20];};```上面的代码定义了一个名为`data`的共用体,包含了三个成员变量:`i`,`f`和`str`,分别表示整数、浮点数和字符数组。
C语言 第十一章 结构体与共用体

第十一章结构体与共用体一、选择题1.【C】分析:C题目中是使用了typedef struct NODE,那么我们一定要指导tepydef就是替代的意思。
所以是用OLD来替代struct NODE作为结构体的类型。
同时我们要记住这里的NODE是可以省略的。
2.【B】分析:本题是考查结构体的定义。
A选项是我们一定要记住的,C选项中的x、y、z是写在结构体里面,所以它们都是结构体的成员,D选项中我们知道struct ex的组合是结构体的类型,这两个缺一不可。
选项B中的example是结构体变量名,一般在右大括号后面的是结构体变量名。
3.【B】分析:INTEGER p等价于int *p。
所以B是正确的。
INTEGER *q等价于int **q。
4.【C】分析:在本题中TT为结构体名,用关键字typedef对结构体进行说明,CIN一个具体的结构体类型名等价于struct TT, 可以用CIN来直接定义结构体变量,而不用再写struct。
A:答案不能用TT直接定义结构体变量,一般格式为(struct TT 结构体变量名);B:答案概念错误,D:答案CIN不是结构体变量,是一个具体的结构体类型名。
5.【C】分析:本题和第一题类似,也是对结构体定义的typedef的考查,B中ST不是结构体类型了,被NEW替代了,选项D中我们知道NEW是一个结构体类型,所以不是结构体变量,当出现了typedef struct 这样的定义时,在右括号出现的NEW就是结构体类型,不是结构体变量了。
6.【A】分析:由于typedef struct S 是替换的意思,所以本题目中是用T来代替struct S这个结构体类型,所以T的左右等于了struct S的作用了,也就是可以用T来定义结构体变量,如T born 中的born就是结构体变量。
当然,struct S就失去了原来的作用,不可以用来作结构体类型了。
7.【C】分析:考查的是结构体变量的赋值,data是一个结构体变量,data是用两个域的,一个是a,一个是b。
C语言结构体与共同体

C语言结构体与共同体C语言中结构体和共同体是两种用于组织和管理数据的重要概念。
它们可以帮助程序员更有效地管理和操作数据,提高程序的可读性和可维护性。
一、结构体(Structures)结构体是一种由不同类型的数据成员组成的数据类型,它允许程序员将不同类型的数据组织在一起并使用一个名称来引用它们。
结构体可以包含各种数据类型,例如整数、字符、数组或甚至其他结构体。
结构体的定义通过使用关键字struct来实现。
例如,下面的代码定义了一个名为Person的结构体,其中包含姓名、年龄和性别这三个成员:```cstruct Personchar name[50];int age;char gender[10];};```结构体定义可以在程序的任何地方,通常在函数外部定义,使得它在整个程序中都可见。
结构体的创建和初始化可以使用以下格式:```cstruct Person p1; // 创建名为p1的结构体变量struct Person p2 = {"John", 25, "Male"}; // 创建名为p2的结构体变量并初始化其成员```结构体成员可以通过`.`操作符来访问,例如:```cprintf("Name: %s\n", );```结构体可以作为函数的参数传递,也可以作为函数的返回值。
通过传递结构体作为参数,可以避免传递多个参数,提供了一种有效地传递多个相关数据的方法。
例如,下面的代码演示了一个函数,该函数接受一个名为p的Person结构体作为参数,并打印出其成员的值:```cvoid printPerson(struct Person p)printf("Name: %s\n", );printf("Age: %d\n", p.age);printf("Gender: %s\n", p.gender);```二、共同体(Unions)共同体是一种特殊类型的结构体,它允许不同类型的成员共享同一块内存空间。
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语言编程:第十一章结构体与共用体

10010 Li Fun M 18 87.5 Bejing
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
11.3 结构体变量的引用
结构体变量的引用应该遵循以下原则 • 1)不能将一个结构体变量作为一个整体进行输入和
2)结构体名同标识 符命名规则;
3)分号不能省略
4)成员列表又称“域表”,每个成员也称为域。
5)指定一个结构体类型相当于指定了一个模型,它无 数据,系统对其不分配实际内存单元。
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
struct { int num;
char name[10]; char sex;
int age; float score; char addr[30]; } student1,student2;
(3)
Zhang Sumin (South China Agriculture University Computer Department ,Guangzhou 510640) zsmhome@
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定义结构体类型的同时定义结构体变量
一般形式: 一般形式:
struct 结构体名 { 成员名; 类型标识符 成员名; 成员名; 类型标识符 成员名; ……………. }变量名表列; 变量名表列; 变量名表列
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
结构体数组初始化
分行初始化: 分行初始化 顺序初始化: 顺序初始化 结构体数组引用 struct student struct student 下标] 引用方式: 结构体数组名[下标 引用方式: 结构体数组名 下标 .成员名 {{ int student int num; num; 例 struct struct name[20]; 例 { charnum; char int name[20]; stu[1].age++; struct student { charnum; int sex; char sex; name[20]; {int intname[20]; char sex; intage;num; age; char }; char sex; }; int char name[20]; age; struct student stu[ ]={{100,“Wang Lin”,‘M’,20, int char stu[ age; struct student sex; ]={100,“Wang Lin”,‘M’,20}, }stu[ ]={{……},{……},{……}}; {101,“Li Gang”,‘M’,19, Gang”,‘M’,19}, int age; }stu[ ]={{……},{……},{……}}; 101,“Listrcpy(stu[0].name,”ZhaoDa”); {110,“Liu Yan”,‘F’,19}; }str[3]; 110,“Liu Yan”,‘F’,19}};
形式三: 形式三:
struct { 成员名; 类型标识符 成员名; 成员名; 类型标识符 成员名; ……………. }结构体变量 初始数据 ; 结构体变量={初始数据 结构体变量 初始数据}; 例 struct { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”};
直接定义结构体变量
一般形式: 一般形式:
struct { 成员名; 类型标识符 成员名; 成员名; 类型标识符 成员名; ……………. }变量名表列; 变量名表列; 变量名表列 用无名结构体直接定义 无名结构体直接定义 变量只能一次 变量只能一次
例 struct { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
第十一章 结构体与共用体
11.1 概述 11.2 定义结构体类型和定义结构体变量 11.3 结构体变量的引用 11.4 结构体变量的初始化 11.5 结构体数组 11.6 指针与结构体 11.7 用指针处理链表 * 11.8 共用体(自学) 共用体(自学) * 11.9 枚举类型(自学) 枚举类型(自学) 11.10 用typedef定义类型 定义类型
§11.4 结构体变量的初始化 形式一: 形式一: struct 结构体名
{ 成员名; 类型标识符 成员名; 成员名; 类型标识符 成员名; ……………. }; ; struct 结构体名 结构体变量 初始数据 ; 结构体变量={初始数据 初始数据}; 例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }; struct student stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”};
全部初始化时维数可省
例 统计候选人选票 struct person name { char name[20]; Li int count; Zhang }leader[3]={“Li”,0,“Zhang”,0,”Wang“,0}; main() Wang { int i,j; char leader_name[20]; for(i=1;i<=10;i++) { scanf("%s",leader_name); for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++; } for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count); }
§11.5 结构体数组
结构体数组的定义 三种形式: 三种形式:
25B num name sex age num name sex age stu[1] stu[0]
形式一: 形式一: struct student 形式二: 形式二: { student struct int num; 形式三: 形式三 char name[20]; { int num; struct char sex; char name[20]; { int num; int age; char sex; }; char name[20]; int age; struct char sex; stu[2]; student }stu[2]; int age; }stu[2];
{ int num; 例 struct student char sex; char name[20]; char name[20]; stu1.score=85.5; student 例 structintsex; { num; char intprintf(“%d,%s,%c,%d,%f,%s\n”,stu1); (×) age; × if(stu1==stu2) char sex; { int char name[20]; stu1.birthday.month=12; int num; age; float score; …….. (×) × stu1.score+=stu2.score; char name[20]; int age; struct date char addr[30]; stu1.age++; float score; float score; char sex; { int month; × char addr[30]; stu1={101,“Wan Lin”,‘M’,19,87.5,“DaLian”}; (×) }stu1,stu2; addr[30]; char birthday int int day; }stu1,stu2; age; num name float score; }stu1,stu2; month day year int year; stu2=stu1; ( ) char addr[30]; }birthday; }stu1,stu2; }stu1,stu2;
说明
结构体类型与结构体变量概念不同
类型:不分配内存; 类型 不分配内存; 不分配内存 类型:不能赋值 存取、运算; 不能赋值、 类型 不能赋值、存取、运算 变量:分配内存 变量 分配内存 变量:可以 变量 可以
结构体可嵌套 结构体成员名与程序中变量名可相同, 结构体成员名与程序中变量名可相同,不会混淆 例 struct date { 例 struct student int month; 结构体类型及变量的作用域与生存期 { int num;
addr
30字节 字节
结构体类型定义的作用域 结构体类型定义的作用域
结构体类型定义描述结构 的组织形式,不分配内存 的组织形式 不分配内存
§11.2 结构体变量的定义
先定义结构体类型, 先定义结构体类型,再定义结构体变量 一般形式: 一般形式:
struct 结构体名 { 成员名; 类型标识符 成员名; struct 例 #define STUDENT 成员名;student 类型标识符 成员名; STUDENT 例 struct student ……………. { int num; };int num; { ; char name[20]; 结构体名 变量名表列; char struct name[20]; 变量名表列; char sex; char sex; int age; int age; float score; float score; char addr[30]; addr[30]; char }; }; struct student stu1,stu2;stu1,stu2; STUDENT
§11.3 结构体变量的引用 引用规则
结构体变量不能整体引用 只能引用变量 结构体变量不能整体引用,只能引用变量成员 不能整体引用 只能引用变量成员 引用方式: 结构体变量名.成员名 引用方式: 结构体变量名 成员名 例 struct 成员 分量 运算符 student 成员(分量 分量)运算符 可以将一个结构体变量赋值给另一个结构体变量 可以将一个结构体变量赋值给另一个结构体变量 例 struct student { stu1.num=10; int num;1 优先级: 优先级 结构体嵌套时逐级引用 结构体嵌套时逐级引用 { int num; 例 struct student 结合性:从左向右 结合性 从左向右 char name[20];
count 0 0 0
Ch8_2.c
§11.6 结构体和指针
num