第七章结构体与共用体

合集下载

C程序设计(第四版)第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;

结构体与共用体zlh

结构体与共用体zlh
数据类型
结构体中每个成员可以是不同的 数据类型,而共用体中所有成员 必须是相同的数据类型。
结构体与共用体的区别与联系
• 使用方式:结构体中每个成员都可以单独访问和操作,而 共用体中一次只能使用其中一个成员。
结构体与共用体的区别与联系
自定义类型
结构体和共用体都是用户自定义的数据类型 ,可以根据需要组合不同的数据类型。
对于大型结构体和共用体,可以使用指针成 员来减少直接内存占用。
在跨平台编程时,要注意不同平台下的内存 对齐规则可能不同,需要进行相应的调整。
05
结构体与共用体的应用案例
案例一:使用结构体实现学生信息管理
定义学生结构体
包含学生姓名、学号、性别、年龄等字段。
创建学生信息数组
根据学生数量,创建相应大小的学生信息数组。
访问速度较慢
访问结构体的成员变量时,需要通过 指针或引用等方式进行间接访问,相 对于直接访问基本数据类型,速度较 慢。
结构体与共用体的优缺点分析
内存占用小
共用体中的所有成员变量共享同一块内存空间,因此相对于 结构体,共用体的内存占用较小。
访问速度快
访问共用体的成员变量时,可以直接通过内存地址进行访问 ,速度较快。
封装性好
结构体可以将多个变量封装在一起,形成一个自定义的数据类型,方便数据的 处理和管理。
结构体与共用体的优缺点分析
• 可扩展性强:结构体可以方便地添加或删除成员 变量,以适应不同的应用场景和需求。
结构体与共用体的优缺点分析
内存占用较大
由于结构体中每个成员变量都占用独 立的内存空间,因此相对于基本数据 类型,结构体的内存占用较大。
赋值给共用体变量
可以给共用体的任何一个成员赋值,如`data.f = 3.14;`,表示将 `data`的`f`成员赋值为3.14。

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语言程序设计——结构体和共用体(完整版)

C语言程序设计——结构体和共用体(完整版)

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++程序设计教程-第7章结构体与共用体

C++程序设计教程-第7章结构体与共用体

C++程序设计
湖南大学
杜四春、银红霞
在定义了结构体变量后,就可以用不同的赋值方 法对结构体变量的每个成员赋值。例如:
strcpy(,”Zhang San”);
worker1.age=26;
strcpy(worker1.phone,”1234567”);
worker1.sex=’m’;
char addr[20];
}stu[3];
C++程序设计
湖南大学
杜四春、银红霞
3. 直接定义结构体数组
结构体数组的定义形式如下:
struct
//没有结构体名
{ 成员表列; }数组名[元素个数];
例如: struct {
char name[20];
char sex;
int age;
char addr[20];
C++程序设计
湖南大学
杜四春、银红霞
1. 先定义结构体类型,再用它定义结构体数组。
结构体数组的定义形式如下:
struct 结构体名 {
例如: struct student
成员表列;
{
}; struct 结构体名
char name[20]; char sex; int age;
char addr[20];
结构体数组初始化的一般形式是:
struct 结构体名
{ 成员表列;
}; struct 结构体名 数组名[元素个数]={初始数据表};
C++程序设计
湖南大学
杜四春、银红霞
或者:
struct 结构体名
{
成员表列;
}数组名[元素个数]={初始数据表}; 在对结构体数组进行初始化时,方括号[ ]中元素

C语言第七章选择题

C语言第七章选择题

C 语言选择) 8 713.设有如下定义: struct st {int a; float b;} st1, *pst; 若有 pst=&st1;,则对 st1 中的 a 域的正确引用是 A) (*pst).st1.a B) (*pst).a C) pst->st1.a D) pst.st1.a 714.若有以下定义: struct stru {int a; long b; char c[6];} sampl; 则以下赋值正确的是 A) sampl.c= "abcd"; B) strcpy(sampl.c, "abcd"); C) sampl->c= "abcd"; D) 以上均不正确 715.以下程序的输出结果是 main() {struct stru{int a; long b; char c[6]; }; printf("%d\n", sizeof(struct stru)); } A) 2 B) 4 C) 6 D) 12 716.以下程序的输出结果是 main() {struct cmplx{int x; int y;} cnum[2]={1,3,2,7}; printf("%d\n", cnum[0].y/cnum[0].x*cnum[1].x); }
C 语言选择题库
汕头大学许创编辑
结点插入到链表末尾的语句组是 data next data next ┌──┬───┐ ┌──┬───┐ head│ E │ +→│ F │ NULL│ └──┴───┘ └──┴───┘ ↑p A) s->next=NULL; p=p->next; p->next=s; B) p=p->next; s->next=p->next; p->next=s; C) p=p->next; s->next=p; p->next=s; D) p=(*p).next; (*s).next=(*p).next; (*p).next=s; 723.以下程序的输出结果是 #include int a[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9}, *p; main( ) {p=(int*)malloc(sizeof(int)); f(p, a); printf("%d\n", *p); } f(int *s, int p[ ][3]) {*s=p[1][1];} A) 1 B) 4 C) 7 D) 5

结构体与共用体


2020/12/16
15
8.1 结构体
8.1.2 结构体数组
定义结构体数组的方法和结构体变量相似:
(1) struct 结构体名 {成员表列} 数组名[数组长度];
(2) 先声明一个结构体类型,然后再用此类型定义结构体数组: 结构体类型 数组名[数组长度];
例8.3 编写程序,利用结构体数组存储和显示三个学生的信息。 算法描述:首先定义并初始化一个结构体数组,然后通过printf 函数输出到屏幕上即可。
return 0;
}
2020/12/16
17
8.1 结构体
程序分析: 程序中定义了一个外部结构体数组stu,共3个元 素,并作了初始化赋值。在main函数中用for语句 逐个输出各元素的各个成员值。
2020/12/16
18
8.1 结构体
8.1.3 结构体指针
指向结构体变量的指针
例8.4 使用指向结构体变量的指针来访问结构体变量的 各个成员。
struct student
{ int num;
char name[10];
float score; };
int main ()
{struct student stu[3]={{1, "Wang", 90.0}, {2, "Qian", 89.5}, {3, "Sun", 85.0}};
struct student *p; int i;
注意 : (1)在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号 括起来的一些常量。如:
struct Student a={10001,"Li Ming",'M',"Bei Jing"};

结构体与共用体-枚举

枚举常量的定义
枚举常量是枚举类型的成员,每个枚举常量都有一个整数值与之对应,默认从0 开始,也可以显式指定。
枚举变量
枚举变量的声明
使用枚举类型名称声明枚举变量,例如`enum Color color;`。
枚举变量的赋值
枚举变量只能赋值为枚举常量列表中定义的整数 值或对应的枚举常量名称。
枚举变量的使用
嵌套共用体
嵌套共用体是一个共用体内部包含另一个共 用体或结构体的情况。
共用体变量
声明
共用体变量的声明方式与结构体 变量类似,需要使用共用体类型 名来定义变量。
访问
访问共用体变量的成员需要使用 成员访问运算符(.),且每次只 能访问一个成员。
01
02
定义
共用体变量是用来存储共用体类 型数据的变量。
03
结构体与共用体-枚举
目录
• 结构体概述 • 共用体概述 • 枚举概述 • 结构体、共用体与枚举的关系 • 结构体、共用体与枚举的应用实例 • 总结与展望
01
结构体概述
定义与特点
01
结构体是一种用户自定义的数据类型,允许将不同类型的数据 组合成一个有机的整体。
02
结构体中的数据可以是基本数据类型,也可以是其他结构体类
未来发展趋势预测
01 02
结构化数据处理
随着大数据时代的到来,处理结构化数据变得越来越重要。结构体作为 一种表示结构化数据的数据类型,将在数据处理和分析领域发挥越来越 重要的作用。
内存优化
共用体可以在相同的内存位置存储不同的数据类型,从而节省内存空间。 在内存资源紧张的情况下,共用体的使用将变得更加重要。
04
当需要提高代码的可读性和可维护性时,可以使用枚举类型来代替一 些硬编码的常量值。

《结构体和共用体》PPT课件


精选课件
13
在C语言的运算符中,取成员运算符“.”优先级最高, 故以上语句均为对引用之后的成员变量进行操作。若结构体 定义是嵌套的,则只能引用最低级的成员(用若干“.”运 算符,逐级引用到最低级)。如
stud3.birthday.year 是合法的,而
stud3.year 是非法的。
精选课件
14
2. 结构体类型变量可以整体引用来赋值。如stud2= stud1;即将变量stud1的所有成员的值一一赋给变量 stud2的各成员。结构体型变量只能对逐个成员进行输入或 输出,不可进行整体的输入输出,如:
};
有同样的地位和作分用号,不都可可少以用来定义变
量的类型。
精选课件
5
定义一个结构体类型的一般形式为: struct 结构体名
{ 类型标识符 成员1; 类型标识符 成员2; … 类型标识符 成员n;
};
成员的类型可为除该结构体类型外的任何一种类型,如 基本类型、指针类型和结构体类型。
精选课件
6
若定义结构体类型struct date如下:
10
3. 直接定义结构体类型变量,其一般形式为:
struct
{
成员表列;
}变量名表;
即不出现结构体名。如
struct
{char num[10];
char name[20];
char sex;
ቤተ መጻሕፍቲ ባይዱ
struct date birthday;
float score[3];
char tel[12];
}stud3,stud4;
结构体类型的名称
char sex;
结构体成员列表,
char birth在dasytr[u8c];t studen包t括类每型个起结作构用体的成范围内, float scorest[r3u]c;t student员和的系类统型提及供名的称标准类型
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第七章结构体与共用体【计划课时】授课课时+上机课时(预习内容:教材第十一章)与已学过的各种标准数据类型相比,本章介绍——如何自己构造数据类型(构造型数据)一、结构体1.概述数组——相同标准类型数据(数组元素)的集合(char/int/float等)结构体——用户选定的各种类型数据(“成员”或“域”)的集合(无穷种)数据库技术中,建立一个库文件的步骤是:先建空表(表头),后输记录。

同一记录的不同字段可以为不同的类型,可以有不同的长度。

一条记录的总长度为各字段之和(+1)。

建立一个结构体类似于数据库中建立“表头”。

其基本形式如下:关键字用户指定struct 结构体名{ ……类型标识符成员名; /*成员表列*/……} ; /*分号不能省略*/【例一】struct s tudent{ int number;char name[6]; /*number,sex等为成员名*/char sex;int age;char address[20];} ;本质上,它定义了一个名为”student”的“结构体类型”(表头)。

该结构体类型的作用:用来定义“结构体变量”。

注意成员定义与普通变量定义的区别:成员定义时——不为其分配内存变量定义时——为其分配内存到此,struct student 相当于标准数据类型关键字char, int ,float…我们可以用它来定义“结构体变量”。

比较:int a,b,c; 定义三个整型变量,每个变量占二个字节,可单独赋值。

struct student a,b,c;定义三个结构体类型变量,每个变量下有若干“成员”。

其占用的内存长度等于各成员项长度之和。

【例二】以下程序的运行结果是什么?main(){ union u_type{ int i;char ch[6]; long s; }; 2 6 4struct st_type{ union u_type u;float score[3];};printf("%d\n",sizeof(struct st_type)); } 64×3=12 12+6=18结果:182、结构体类型变量的定义①用struct 结构体名复合词定义struct 结构体名{…};struct 结构体名变量名1,变量名2,…变量名n;②在定义结构体类型的同时定义struct 结构体名{…}变量名1,变量名2,…变量名n;③直接定义结构体类型变量struct{…}变量名1,变量名2,…变量名n;实际使用中,还可以使用以下形式:先定义 #define STU struct student尔后 STU student1,student2;注意:结构体的成员可以是另一个结构体。

【例三】若有以下定义,则正确的赋值语句为。

struct complex{float real;float image;};struct value{ int no;struct complex com;}val1;A) com.real=1; B) plex.real=1;C) .real=1; D) val1.real=1;答案:C)val1.Val13、结构体变量的初始化和赋值使一个结构体变量获得数据“值”有三种方法:①定义时初始化之【例四】struct{ char name[15];char class[12];long num;} stu={“Wenli”,”Computer 1”,200113};②用赋值语句对各成员分别赋值只能逐个成员进行,不能将结构体变量作为一个整体进行输入和输出。

如对结构体变量val1,以下语句是错误的:scanf(“%s,%s,%ld”,stu);printf(“%s,%s,%ld”,stu);可改为:scanf(“%s,%s,%ld”,,stu.class,&stu.num);printf(“%s,%s,%ld” ,,stu.class,&stu.num);亦可用以下赋值语句:strcpy(,”wenli”);strcpy(stu.class, “Computer”;stu.num=200113;③同类型的结构体变量间相互赋值student1=student24、结构体变量的引用引用其成员变量用圆点(成员运算符)——优先级最高如val1.no++ sum=.real+.image可以将成员变量按普通变量运算方式处理,包括取地址:&val1 (函数间传递用)&val1.no对多级结构体,只能对最低级的成员进行赋值、存取及运算处理。

5、结构体数组①定义·定义结构体后定义P222·定义结构体时同时定义②初始化·一般初始化·省略维数[ ]·定义后初始化②引用此时每个结构体数组元素都有若干“成员”。

可以用以下形式来标识它们:数组名[i].成员名如stu[3].age6、指向结构体变量的指针一个结构体变量的指针就是该变量所占据的内存段的起始地址。

如果struct student stu_1;struct student *p;p=&stu_1;则以下三种形式等价:stu_1.age (*p).age p->age此时p->age++ 等效于(p->age)++ 先得到成员值,再使它加1++p->age 等效于++(p->age) 先使成员值加1,再使用之而如果struct student stu[5];struct student *p;p=stu;此时指针变量p的值为结构体变量p的首地址。

且p++ 表示移到下一个数组元素而非下一个成员(++p)->age 表示p先自加1(移到下一数组元素处),然后取成员值(p++)->age 表示先取p->age的值,然后p自加(移到下一数组元素处)注意:如果有struct student *p;此时p存放结构体变量指针,不可指向数组元素,如p=&stu.age如果需要指向数组元素,应另设普通指针变量,如int *p1;p1=&stu.age【例四】求程序运行结果。

main(){ struct wc{ int a;char *b;}*p;static struct wcx[2]={10,"abcd",30,"ABCD"};p=x;printf("%d,",p->a);printf("%c\n",*(++p)->b);}答案:10,A7、链表图形P230 图10.11·按需分配内存·不连续存放头指针(head)变量结点的概念(每个结点中应包括一个指针变量,用它存放下一结点的地址)。

最后一个结点的地址部分存放一个“NULL”(空地址)。

定义形式:struct student{ int number;char name[6];struct student *next;};p=p->next 将p原来所指结点中next的值赋给p,而p->next值即下一结点起始地址,故p=p->next 的作用是将p转向下一结点。

【】3、以下程序的功能是统计一个单向链表中结点的个数,其中head指向链表的首结点。

#include <stdio.h>#include <alloc.h>main(){struct node{char data;struct node *next;}*pl, *head;int count=0;... /* 建立单向链表的程序段省略*/pl=head;while( 【3】!=NULL){count++;pl= 【4】;}printf("%d", count);...}答案:【3】p1 【4】p1->next【24】以下程序的运行结果是什么?main(){ union u_type{ int i;char ch[6];long s;};struct st_type{ union u_type u;float score[3];};printf("%d\n",sizeof(struct st_type)); } 26464×3=12 12+6=18结果:18【25】以下程序的运行结果是什么?main(){ enum color{red,green=4,blue,white=blue+10}; /*red=0,blue=5*/ printf("%d,%d,%d\n",red,blue,white);}结果:0,5,15。

相关文档
最新文档