实验十一 结构体(struct)与共用体(union)

合集下载

C语言中的结构体与联合体详解

C语言中的结构体与联合体详解

C语言中的结构体与联合体详解C语言是一门广泛应用于系统开发和嵌入式领域的编程语言。

在C 语言中,结构体和联合体是两种常用的复合数据类型。

本文将详细讨论结构体和联合体在C语言中的使用以及它们的区别。

一、结构体 (Struct)结构体是一种自定义的数据类型,允许我们将不同类型的变量组合在一起,形成一个新的数据类型。

它以"struct"关键字开始,后面跟着结构体的名称,然后是一对花括号{ }。

在花括号中,我们可以定义多个不同类型的成员变量,每个成员变量用分号结束。

举个例子,假设我们需要表示一个学生的信息,我们可以定义一个包含学生姓名、年龄和成绩的结构体:```cstruct Student {char name[50];int age;float score;};```在上面的例子中,我们定义了一个名为Student的结构体,它有三个成员变量:name、age和score。

使用结构体时,我们可以通过"结构体名.成员名"的方式来访问成员变量。

例如,要输出学生的姓名,我们可以使用`printf("%s",)`。

二、联合体 (Union)联合体也是一种自定义的数据类型,它允许我们在同一块内存空间中存储不同类型的数据。

与结构体不同的是,联合体中的成员变量共享同一块内存空间,因此只能同时存储其中的一个成员变量。

联合体以"union"关键字开始,后面跟着联合体的名称,然后是一对花括号{ }。

在花括号中,我们可以定义多个不同类型的成员变量,每个成员变量用分号结束。

举个例子,假设我们需要表示一个图形的信息,我们可以定义一个包含圆的半径和矩形的长度和宽度的联合体:```cunion Shape {float radius;struct {float length;float width;} rectangle;};```在上面的例子中,我们定义了一个名为Shape的联合体,它有两个成员变量:radius和rectangle。

C语言常识结构体与联合体

C语言常识结构体与联合体

C语言常识结构体与联合体C语言中的结构体(structure)和联合体(union)是用来组织和管理数据的重要概念。

它们可以用于存储不同数据类型的元素,并且允许以多种方式访问和操作这些元素。

以下将详细介绍结构体和联合体的定义、使用、特点以及它们在C语言中的应用。

一、结构体(Structure)的定义与使用结构体是一种用户自定义的数据类型,它可以由不同的数据类型组成。

通过结构体,我们可以将相关的数据项组合到一起,从而形成一个逻辑上的实体。

结构体的定义格式如下:```struct 结构体名数据类型1成员名1;数据类型2成员名2;…};```其中,结构体名是自定义的标识符,可以用来声明该结构体类型的变量。

成员名是结构体中的数据项名称,数据类型表示成员的数据类型。

结构体的使用可以分为两个步骤:定义结构体类型和声明结构体变量。

定义结构体类型:```struct Personchar name[20];int age;float height;};```声明结构体变量:```struct Person p1; //声明一个Person类型的结构体变量p1```结构体的成员可以通过“结构体变量名.成员名”的形式进行访问和操作。

访问和操作结构体成员的示例:```strcpy(, "Tom"); //使用strcpy函数将字符串"Tom"复制给p1结构体变量的name成员p1.age = 20; //给p1结构体变量的age成员赋值为20p1.height = 1.8; //给p1结构体变量的height成员赋值为1.8```二、结构体的特点1.结构体可以由不同类型的数据组成,可以灵活地根据需求定义。

2.结构体的成员在内存中是按照定义的顺序依次存放的,可以通过成员名访问对应位置的数据。

3.可以将结构体作为函数的参数和返回值,方便传递和处理复杂的数据结构。

4. 可以通过sizeof运算符来获取结构体的大小。

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};

第11章结构体与共用体

第11章结构体与共用体
第11章 结构体与共用体
1
结构体与共用体
1 2 3 4 5 6 7 定义结构体类型变量的方法 结构体变量的引用 结构体数组 指向结构体类型数据的指针 共用体 枚举类型 用typedef定义类型
2
结构体与共用体

概述
在当代信息处理中,往往需要处理相同的属性、不同的数据 类型,如:人事档案,涉及职员的描述和处理时,有职工的 姓名、性别、年龄、文化程度、工资、住址等数据,其中姓 名、性别、文化程度、住址属于字符型,而年龄则是整型, 工资是实型,这些不同的事物都属于同一个事物(职员)所有 ,本身有内在的关系。
17
指向结构体类型数据的指针
18
指向结构体类型变量的指针
指向结构体变量的指针

一个结构体变量的指针就是该变量所占据的内存段的起始 地址。 指针变量也可用来指向结构体数组中的元素。 C语言规定:可以把(*p).num改用p->num表示,即以下三种 形式等价: 结构变量.成员名 (*p).成员名 p->成员名(其中"->"称为指向运算符)
struct 结构体名 { 成员表列 } 变量名表列;
3. 直接定义结构类型变量:
struct { 成员表列 } 变量名表列;
7
结构体与共用体
定义结构体类型变量的方法
关于结构体类型的说明

类型与变量是不同的概念,不要混同。 通过struct定义的结构体类型和int,float等有着同等的地 位。 只能对变量赋值、存取或运算,而不能对一个类型赋值、 存取或运算。 在编译时,对类型是不分配空间的,只对变量分配内存空 间。 对结构体中的成员(即"域"),可以单独使用,它的作用与 地位相当于普通变量。 成员也可以是一个结构体变量。 成员名可以与程序中的变量名相同,二者不代表同一对象。

C语言教程之结构体共用体与位运算

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语言中的结构体和共用体(联合体)

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 等)具有同样的作用,都可以用来定义变量的类型。

结构体变量前面只是声明了一个结构体类型,它相当于一个模型,但其中并无具体的数据,编译系统对其也不分配实际的内存单元。

实验十一 结构体(struct)与共用体(union)

实验十一 结构体(struct)与共用体(union)

实验十一结构体(struct)与共用体(union)实验目的理解并掌握使用不同数据类型的变量组合成一个数据的组合体-结构体与共用体的定义与引用;正确使用结构体数组、结构体与函数及指向结构体的指针。

要点提示1.结构体定义的一般格式为:struct 结构体类型名{数据类型成员名1;数据类型成员名2;……数据类型成员名n;};2.结构体变量的说明struct 结构体类型名结构体变量名;3.引用结构体成员结构体变量名.成员名共用体与结构体有相似的使用形式实验内容●结构体的定义与引用●结构体与函数●结构体数组●指向结构体的指针●共用体的定义与引用实验步骤读懂并输入程序,完成填空后输出结果1.建立学习成绩单结构,并建立一个同学王林(wanglin)的记录。

#include <stdio.h>main(){struct grade /* 定义结构体类型*/{int number;char name;int math;int english;};struct 【】wanglin; /* 说明结构体变量*/printf("Please input the number, name, math, english:\n");scanf("%d,%d,%d",&【】,& wanglin. name,【】& wanglin.english);printf("wanglin 'grade is: %d/%d/%d\n", wanglin. number, , wanglin.math, wanglin.english);}程序执行过程与结果:Please input the number, name, math, english::26,A, 85,90wanglin ' grade is:#include <stdio.h>main(){struct grade /* 定义结构体类型*/{int number;char name;int math;int english;};struct grade wanglin; /* 说明结构体变量*/printf("Please input the number, name, math, english:\n");scanf("%d,%c,%d,%d",&wanglin. number,& wanglin. name,& wanglin. math,& wanglin.english);printf("wanglin 'grade is: %d/%c/%d/%d\n", wanglin. number, , wanglin.math, wanglin.english);}Please input the number, name, math, english:26,A,85,90wanglin 'grade is: 26/A/85/90Press any key to continue请再建立一个刘芳(liufang)的成绩记录, 比较一下。

struct与union的基本用法

struct与union的基本用法

struct与union的基本⽤法结构体与联合体是C语⾔的常见数据类型,可对C的基本数据类型进⾏组合使之能表⽰复杂的数据结构,意义深远,是优异代码的必备⼯具。

⼀. struct与 union的基本⽤法,在语法上union与struct相同,因此只以struct为例1.1 基本⽤法:01. struct AA{ int a; int b;}; //结构体的声明和定义02. struct AA s1; //变量的声明和定义03. s1.a=3; //变量的使⽤:复制代码1.2 在声明结构体的同时定义变量:01. struct AA{int a; int b}s2={1, 2}; //此处AA为可选项,初始化部分为可选02. s2.a=5; //变量的使⽤复制代码1.3 使⽤ typedef 来简化struct的类型说明:01. typedef struct AA{int a; int b;}SAA;02. SAA s3, s4; //变量的声明和定义03. s3.a=8; //变量的使⽤复制代码1.4 使⽤时尤其注意后⾯的分号,必不可少;⼆. struct 与 union的区别2.1 struct中的成员是按顺序依次排列,互相独⽴,在排列时引⼊了对齐问题(2.2);⽽union中的成员共⽤⼀块内存,起始地址都是相同的,即union中的成员是对同⼀地址的多个引⽤、对同⼀地址的多种表达⽅法。

2.2 struct的对齐问题对齐问题即struct中每个成员起始地址的分配。

为了可以快速访问到每个成员,(以EW430为例)编译器根据成员的类型放到合适的地址上,默认为2字节对齐。

如:Struct AA{char c; int d;}aa;假设aa被分配在地址N上,并且N为偶数,则aa.c的地址为N,aa.d的地址为N+2,⽽N+1地址未使⽤被浪费了。

对齐字节⼤⼩的指定:通过#pragma pack(n)来指定对齐字节的⼤⼩,n为某些常量(EW430中可取1,2,4,8,16),指定以n字节对齐。

C语言程序设计实验报告(结构体和共用体)

C语言程序设计实验报告(结构体和共用体)

C语言程序设计实验报告(结构体和共用体)1实验目的1、掌握结构体类型变量的定义和使用;2、掌握结构体类型变量数组的概念和使用;3、掌握链表的概念,初步学会对链表进行操作;4、掌握共用体的概念和使用。

2实验内容1)在一个结构体数组中存入三个人的姓名及年龄,输出三者中年龄居中者的姓名及年龄。

要求:1、三个人的数据采用直接初始化的方式赋值;2、利用结构体指针实现处理过程。

3算法描述流程图4源程序#include<stdio.h>main(){struct students{char name[10];int age;} stu[3]={{"Jack",17},{"Anne",16},{"Tom",19}},stu1[3];struct students *stu2=&stu[0],*t=&stu1[0];int i,j,k;for(i=0;i<2;i++){k=i;for(j=i+1;j<3;j++){if(((stu2+j)->age)<((stu2+k)->age))k=j;}*t=*(stu2+k);*(stu2+k)=*(stu2+i);*(stu2+i)=*t;}printf("三人中年龄居中者姓名:%s,年龄:%d\n",stu[1].name,stu[1].age); }5测试数据{"Jack",17},{"Anne",16},{"Tom",19}6运行结果7出现问题及解决方法;实验中,引用结构体数组出现错误,忘记写{},指针的初始化忘记写*,这些问题都是些低级错误,不应该犯的,在循环中,i的初始化错误。

以后应更加仔细,多注意细节问题,很多时候细节是决定事情的关键。

8实验心得在本次试验中,我通过学习和实践,对结构体类型变量的定义和使用以及链表的概念有了更清楚的理解,初步学会了对链表进行操作,掌握了结构体类型变量数组以及共用体的使用。

C语言中的结构体和联合体

C语言中的结构体和联合体

C语言中的结构体和联合体在C语言中,结构体和联合体是两种用来组织数据的重要数据类型。

它们允许我们将不同类型的数据组合在一起,以便于管理和处理。

在本文中,我将详细介绍C语言中的结构体和联合体,包括它们的定义、访问和使用方法。

首先,让我们来看看结构体(struct)的定义和用法。

结构体是一种用户自定义的数据类型,可以包含不同类型的数据成员。

结构体的定义一般如下:```struct 结构体名 {数据类型1 成员名1;数据类型2 成员名2;...};```例如,我们可以定义一个表示学生信息的结构体:```struct Student {char name[20];int age;float score;};```在这个例子中,我们定义了一个名为Student的结构体,它包含了学生的姓名、年龄和成绩三个数据成员。

要使用结构体,我们可以按照以下方式声明结构体变量并对其进行初始化:```struct Student stu1 = {"Alice", 20, 85.5};```我们也可以通过成员访问运算符(.)来访问结构体变量中的成员:```printf("Name: %s\n", );printf("Age: %d\n", stu1.age);printf("Score: %.1f\n", stu1.score);```接下来,让我们来了解一下联合体(union)的定义和用法。

联合体与结构体类似,也是一种用户自定义的数据类型,但不同的是,联合体的成员共享一块内存空间。

因此,联合体的大小等于其最大成员的大小。

联合体的定义一般如下:```union 联合体名 {成员1数据类型成员1名称;成员2数据类型成员2名称;...};```举个例子,我们可以定义一个表示长方形的联合体:```union Rectangle {int width;int height;};```在这个例子中,我们定义了一个名为Rectangle的联合体,它包含了长方形的宽和高两个成员。

C语言学习入门笔记之结构体与共用体

C语言学习入门笔记之结构体与共用体

结构体与共用体笔记定义结构体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++中的共用体(union)结构解析与结构体(struct)共用体(union)的区别

C++中的共用体(union)结构解析与结构体(struct)共用体(union)的区别

C++中的共用体(union)结构解析与结构体(struct)共用体(union)的区别C++中的共用体(union)结构解析与结构体(struct)共用体(union) 的区别分类: C++开发博文 2012-04-10 09:58 969人阅读评论(1) 收藏举报structc++c共用体(union)一、基础概念有时需要使几种不同类型的变量存放在同一段内存单元中。

虽然在同一段内存中不同数据类型所占字节数不同,但都从同一地址开始存放,也就是使用了覆盖技术,几个变量互相覆盖。

这种使几个不同的变量共占一段内存的结构,称为共同体类型的结构(也称为联合类型)。

二、声明共用体类型的一般形式:union 共用体类型名{成员表列};定义共用体变量的一般形式:共用体类型名共用体变量名;也可以在声明共用体类型的同时定义共用体变量,也可以没有共用体类型名直接定义共用体变量。

union data{int i;char ch;double d;}a,b,c;三、“共用体”与“结构体”区别结构体变量所占内存长度是各成员占的内存长度之和。

每个成员分别占有其自己的内存单元。

共用体变量所占的内存长度等于最长的成员的长度。

四、对共用体变量的访问方式不能直接引用共用体变量,只能引用共用体变量中的成员。

a.i; a.ch a.f不能引用共用体变量:cout<<a;五、共用体类型数据的特点1、使用共用体变量的目的是希望在同一个内存段存放几种不同类型的数据。

注意:在每一瞬时只能存放其中一种,而不是同时存放多种。

换句话说,每一瞬时只有一个成员起作用,其他成员不起作用。

2、能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。

因此在引用共用体变量时应注意当前在共用体变量中起作用的是哪个成员。

3、共同体变量的地址和它的各成员的地址相同,为同一个地址。

4、不能对共用体变量名赋值;不能引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。

C语言的结构体与联合体

C语言的结构体与联合体

C语言的结构体与联合体引言C语言作为一种通用的编程语言,提供了很多强大的数据结构和类型定义功能。

其中,结构体(struct)和联合体(union)是两种重要的类型定义方式。

本文将介绍C语言中结构体与联合体的概念、用法和应用场景。

结构体什么是结构体结构体是C语言中一种自定义的复合数据类型,可以将不同类型的数据组合在一起,形成一个新的数据类型。

结构体由多个成员变量组成,每个成员变量可以是不同的类型,在内存中按照顺序存储。

结构体的定义和声明struct结构体名称 {成员类型成员变量1;成员类型成员变量2;...};例如,定义一个表示学生的结构体:struct Student {int id;char name[20];int age;};结构体的初始化和访问可以使用初始化列表的方式对结构体进行初始化:struct Student stu = {10001, "Tom", 18};通过.操作符可以访问结构体的成员变量:printf("学生ID:%d\n", stu.id);printf("学生姓名:%s\n", );printf("学生年龄:%d\n", stu.age);结构体的应用结构体在实际应用中非常常见,可以用来表示复杂的数据结构,如图书、员工、汽车等。

结构体还可以嵌套定义,用于构建更复杂的数据结构。

联合体什么是联合体联合体(union)是C语言中一种特殊的数据类型,只能同时存储一个成员变量的值。

联合体的成员变量共享同一块内存空间,但只能访问最后一次赋值的成员变量。

联合体的定义和声明union联合体名称 {成员类型成员变量1;成员类型成员变量2;...};例如,定义一个表示图形的联合体:union Shape {int width;int height;};联合体的初始化和访问可以使用初始化列表的方式对联合体进行初始化:union Shape s = {10};通过.操作符可以访问联合体的成员变量:printf("图形的宽度:%d\n", s.width);printf("图形的高度:%d\n", s.height);联合体的应用联合体常用于处理类型转换或者节省内存空间的场景。

struct和union结构体和联合体的区别

struct和union结构体和联合体的区别

struct和union结构体和联合体的区别(转)共用体构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-------自定义数据类型---------------------------------------------------------------结构体变量所占内存长度是各成员占的内存长度的总和。

共同体变量所占内存长度是各最长的成员占的内存长度。

共同体每次只能存放哪个的一种!!共同体变量中起作用的成员是尊后一次存放的成员,在存入新的成员后原有的成员失去了作用!---------------------------------------------------------------Structure 与Union主要有以下区别:1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。

在struct中,各成员都占有自己的内存空间,它们是同时存在的。

一个struct变量的总长度等于所有成员长度之和。

在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。

Union变量的长度等于最长的成员的长度。

2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的。

举一个例子:例:#include <stdio.h>void main(){union{ /*定义一个联合*/ int i;struct{ /*在联合中定义一个结构*/ char first;char second;}half;}number;number.i=0x4241; /*联合成员赋值*/printf("%c%c\n", number.half.first, number.half.second); number.half.first='a'; /*联合中结构成员赋值*/ number.half.second='b';printf("%x\n", number.i);system("pause");}输出结果为:AB6261分析:union的成员是共用内存的union{int i;struct{char first;char second;}half;}number;number.i=0x4241;在这里i 和half结构是共用内存number.i=0x4241给i赋值后,内存中以二进制存储0100 0010 0100 0001按顺序对应到结构中halt.first=01000010 转换成10进制就是66(字母A的asc码)halt.second=01000001 转换成10进制是65 (字母B的asc码)所以输出后就是AB下面同理了==========================================================================第一题:#include <stdio.h>union{int i;char x[2];}a;void main(){a.x[0] = 10;a.x[1] = 1;printf("%d",a.i);}答案:266第二题:main(){union{ /*定义一个联合*/int i;struct{ /*在联合中定义一个结构*/char first;char second;}half;}number;number.i=0x4241; /*联合成员赋值*/printf("%c%c\n", number.half.first, mumber.half.second);number.half.first='a'; /*联合中结构成员赋值*/number.half.second='b';printf("%x\n", number.i);getch();}答案:AB 6261C语言中的联合体(UNION)的概念是,联合体中的多种数据类型共享同一个内存空间。

结构体与共用体小结

结构体与共用体小结

结构体与共用体小结结构体和共用体是C语言中非常重要的数据类型。

它们在存储和组织数据方面提供了更灵活的选择。

本文将从定义、声明、初始化、使用和比较等方面对结构体和共用体进行详细讨论。

一、结构体(Struct)结构体是一种能够存储不同类型数据的自定义数据类型。

它允许将不同类型的数据组合在一起,形成一个逻辑上的实体。

1.定义和声明结构体的定义使用关键字`struct`,可以像定义其他变量一样定义结构体。

例如:```cstruct Studentint id;char name[20];int age;};```在定义结构体后,可以使用该结构体类型声明变量。

例如:```cstruct Student stu1;```也可以一步完成结构体类型定义和变量声明。

例如:```cstruct Studentint id;char name[20];int age;} stu1;```2.初始化结构体变量可以使用初始化列表初始化。

例如:```cstruct Student stu1 = {1001, "John", 20};```3.使用结构体变量的成员可以通过`.`运算符访问。

例如:```cstu1.id = 1001;strcpy(, "John");stu1.age = 20;```4.比较结构体不能直接比较,但可以通过定义比较函数来比较。

例如:```creturn (stu1.id == stu2.id && strcmp(, ) == 0 && stu1.age == stu2.age);```二、共用体(Union)共用体是一种特殊的数据类型,它允许不同类型的成员共享同一块内存空间。

共用体的成员在内存中是相互重叠的,只有一个成员可以被赋值和使用。

1.定义和声明共用体的定义使用关键字`union`,可以像定义其他变量一样定义共用体。

例如:```cunion Dataint i;float f;char str[20];};```在定义共用体后,可以使用该共用体类型声明变量。

C语言共用体(C语言union用法)详解

C语言共用体(C语言union用法)详解

C语言共用体(C语言union用法)详解通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。

在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:union 共用体名{成员列表};共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。

共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

共用体也是一种自定义类型,可以通过它来创建变量,例如:1.union data{2.int n;3.char ch;4.double f;5.};6.union data a, b, c;上面是先定义共用体,再创建变量,也可以在定义共用体的同时创建变量:1.union data{2.int n;3.char ch;4.double f;5.} a, b, c;如果不再定义新的变量,也可以将共用体的名字省略:1.union{2.int n;3.char ch;4.double f;5.} a, b, c;共用体 data 中,成员 f 占用的内存最多,为 8 个字节,所以 data 类型的变量(也就是a、b、c)也占用8 个字节的内存,请看下面的演示:1.#include <stdio.h>2.3.union data{4.int n;5.char ch;6.short m;7.};8.9.int main(){10.union data a;11.printf("%d, %d\n", sizeof(a), sizeof(union data) );12. a.n = 0x40;13.printf("%X, %c, %hX\n", a.n, a.ch, a.m);14. a.ch = '9';15.printf("%X, %c, %hX\n", a.n, a.ch, a.m);16. a.m = 0x2059;17.printf("%X, %c, %hX\n", a.n, a.ch, a.m);18. a.n = 0x3E25AD54;19.printf("%X, %c, %hX\n", a.n, a.ch, a.m);20.21.return 0;22.}运行结果:4, 440, @, 4039, 9, 392059, Y, 20593E25AD54, T, AD54这段代码不但验证了共用体的长度,还说明共用体成员之间会相互影响,修改一个成员的值会影响其他成员。

C++课件:第11章结构体与共用体

C++课件:第11章结构体与共用体
person={“li li”,’f’, 24, “primary”,1000}; 错!
C++课件:第11章结构体与共用体
例11.2 定义一个结构体类型,包含通讯录中的如下信息: 姓名、年龄、电话、通讯地址;并定义该类型的变量, 输入数据并输出。
程序l11_2.c
#include "stdio.h" struct address_list {char name[10];
/*{}内是该类型的各成员*/
char sex;
int age;
char position[10];
float salary; };
/*语句末尾是“;” */
该结构体类型名为struct teacher,teacher 是该结构体的标识符; 该类型包含有6个成员的数据项:name、 sex、 age、 position 和salary,其中每个成员项都有自己的类型。
}; struct teacher person; /*定义结构体变量person*/
strcpy(,"wang li");
person.sex=‘f’;
/*给各成员赋值*/
person.age=30;
strcpy(person.position,"middle");
person.salary=1600;
C++第11章结构体与共用体
C++课件:第11章结构体与共用体
1、结构体类型的定义 2、结构体变量的定义及引用 3、结构体数组 4、结构体类型的指针 5、链表的基本操作 6、共用体和枚举类型(了解)
C++课件:第11章结构体与共用体

C语言:结构体和联合体(共用体)

C语言:结构体和联合体(共用体)

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、联合变量的定义和初始化,使⽤第⼀个数据成员做初始化,{}不能省略。

共用体和结构体的区别

共用体和结构体的区别

其中,struct 是结构体关键字,一定不能省略。 node 是结构体名,可以省略,成为无名结构体。 结构体成员可以使基本类型或者构造类型。 3、特点 变量用.访问,指针用 ->访问。eg. node.num = 1; node->ame = abc; 共用体 1、共用体的作用 用覆盖技术,几个变量相互覆盖,从而使几个不同变量共占一段内存 的结构。共用体的所有成员都在一段内存中存放,起始地址一样,并且同一 时刻只能使用其中的一个成员变量。
2、结构体总空间大小,等于各成员总长度,共用体空间等于最大成 员占据的空间。 3、共用体不能赋初值而结构体可以。
2、共用体的定义 共用体如下所示, 其中 union 是共用体关键字,不能省略。node 是共用体名。 3、特点 用体内存长度是内部最长的数据类型的长度。 共用体的地址和内部各成员变量的地址都是同一个地址 主要区别 1、结构体每一位成员都用来表示一种具体事务的属性,共用体成员 可以表示多种属性(同一存储空间可以存储不同类型的数据) 。
共用体和结构体的区别

在 c++中,结构体(struct)和共用体(union)是两种很相似的复合 数据类型,都可以用来存储多种数据类型,但是两者还有很大的区别。 结构体 1、结构体的作用 在网络协议、通信控制、嵌入式系统的 C/C++编程中,我们经常要传 送的不是简单的字节流,而是多种数据组合起来的一个整体,其表现形式就 是一个结构体。 2、结构体的定义 结构体:是指定义相应的数据结构及相应的变量。 结构体如下所示,
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验十一结构体(struct)与共用体(union)实验目的理解并掌握使用不同数据类型的变量组合成一个数据的组合体-结构体与共用体的定义与引用;正确使用结构体数组、结构体与函数及指向结构体的指针。

要点提示1.结构体定义的一般格式为:struct 结构体类型名{数据类型成员名1;数据类型成员名2;……数据类型成员名n;};2.结构体变量的说明struct 结构体类型名结构体变量名;3.引用结构体成员结构体变量名.成员名共用体与结构体有相似的使用形式实验内容●结构体的定义与引用●结构体与函数●结构体数组●指向结构体的指针●共用体的定义与引用实验步骤读懂并输入程序,完成填空后输出结果1.建立学习成绩单结构,并建立一个同学王林(wanglin)的记录。

#include <stdio.h>main(){struct grade /* 定义结构体类型*/{int number;char name;int math;int english;};struct 【】wanglin; /* 说明结构体变量*/printf("Please input the number, name, math, english:\n");scanf("%d,%d,%d",&【】,& wanglin. name,【】& wanglin.english);printf("wanglin 'grade is: %d/%d/%d\n", wanglin. number, , wanglin.math, wanglin.english);}程序执行过程与结果:Please input the number, name, math, english::26,A, 85,90wanglin ' grade is:#include <stdio.h>main(){struct grade /* 定义结构体类型*/{int number;char name;int math;int english;};struct grade wanglin; /* 说明结构体变量*/printf("Please input the number, name, math, english:\n");scanf("%d,%c,%d,%d",&wanglin. number,& wanglin. name,& wanglin. math,& wanglin.english);printf("wanglin 'grade is: %d/%c/%d/%d\n", wanglin. number, , wanglin.math, wanglin.english);}Please input the number, name, math, english:26,A,85,90wanglin 'grade is: 26/A/85/90Press any key to continue请再建立一个刘芳(liufang)的成绩记录, 比较一下。

2.结构体与函数main(){struct /* 局部定义结构*/{int a;char b;}【】;variable.a=1111;variable.a=A;fun(variable.a);printf(" a=%d\n", variable.a);printf(" a=%d\n", variable.b);}fun(nam)struct{int x;char y;}【】; /*定义形参*/{printf(" x1=%d\n",nam.x);nam.x=2222; /*重新赋值*/nam.y=B;printf(" x2=%d\n",nam.x);printf(" x2=%d\n",nam.y);return;}程序执行结果如下:main(){ struct /* 局部定义结构*/{int a;char b;}variable;variable.a=1111;variable.b='A';fun(variable.a);printf(" a=%d\n", variable.a);printf(" b=%d\n", variable.b);}fun(nam)struct{int x;char y;}nam; /*定义形参*/{printf(" x1=%d\n",nam.x);nam.x=2222; /*重新赋值*/nam.y='B';printf(" x2=%d\n",nam.x);printf(" x2=%d\n",nam.y);return;}x1=1111x2=2222x2=66a=1111b=65Press any key to continue3.结构体数组将作业1稍加改动,建立起3个同学的成绩单。

#include <stdio.h>main(){struct grade /* 定义结构体类型*/{int number;char name;int math;int english;};struct grade 【】; /* 说明结构体数组, */printf("Please input the number, name, math, english:\n");for(i=0;i<2;i++){scanf("%d,%d,%d",&【】,& mate[i]. name,【】& mate[i].english);printf(" all grade is: %d/%d/%d\n", mate[i]. number, mate[i].name, mate[i].math, mate[i].english);}}#include <stdio.h>main(){struct grade /* 定义结构体类型*/int number;char name;int math;int english;};struct grade mate[3]; /* 说明结构体数组, */int i;printf("Please input the number, name, math, english:\n");for(i=0;i<3;i++){scanf("%d,%c,%d,%d",& mate[i]. number,& mate[i]. name,& mate[i]. math,& mate[i].english);printf(" all grade is: %d/%c/%d/%d\n", mate[i]. number, mate[i].name, mate[i].math, mate[i].english);}}4.指向结构体的指针用指向结构体的指针引用结构体成员#include <string.h>main(){struct student{int num;char nam;};struct student person1;struct student *p;p=【】; /*指向结构体变量*/person1.num=20001;person1.nam='A';printf("\n");printf("Number:%d\nName: \n", person1.num,person1.nam);printf("\nNumber:%d\nName:\n", (*p).num,(*p).nam);}程序运行结果#include <string.h>{struct student{int num;char nam;};struct student person1;struct student *p;p=&person1; /*指向结构体变量*/person1.num=20001;person1.nam='A';printf("\n");printf("Number:%d\nName:%c \n", person1.num,person1.nam);printf("\nNumber:%d\nName:%c\n", (*p).num,(*p).nam);}Number:20001Name:ANumber:20001Name:APress any key to continue5.共用体的定义与引用在两个同类形的共用体变量之间赋值。

main(){union test{int i;char ch;}【】x.i=2000x.ch=’a’y=x; /*对共用体变量y赋值*/printf(“%d, %c\n”,y.i, y.ch);}main(){union test{int i;char ch;};union test x,y;x.i=2000;x.ch='a';y=x; /*对共用体变量y赋值*/printf("%d, %c\n",y.i, y.ch);}1889, aPress any key to continue请大家分析一下,共用体变量y和共用体变量x的值一样吗?【不一样】作业与练习1.使用结构体数据类型试编一个同学间的通讯录程序,结构体变量的成员有学号(number)、姓名(name)、电话(telphone)、地址(address),输入部分数据,再打印出来。

#include <stdio.h>main(){struct student{int number;char name[20];char tel[20];char addr[50];};struct student a[40];int i;printf("Please input the number, name, telphone, address:\n");for(i=0;i<40;i++){scanf("%d %s %s %s",&a[i]. number,& a[i]. name,& a[i]. tel,& a[i].addr);printf("student: number:%d\nname:\%s\ntelphone:%s\naddress:%s\n", a[i]. number, a[i]. name,a[i]. tel,a[i].addr);}}2.在上述程序的基础上,改用函数调用,在main()函数中输入数据。

相关文档
最新文档