电子技术 第十章 结构体与共用体.doc

合集下载

零基础入门学习C语言课件第十章 结构体与共用体06

零基础入门学习C语言课件第十章 结构体与共用体06
enum weekday{ sun,mou,tue,wed,thu,fri,sat }; enum weekday a, b, c;
或者为:
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个字节。

结构体与共用体

结构体与共用体

10. 1 结构体数据
• 【注意】 • (1) 不能将一个结构体变量作为一个整体进行赋值和输出; 只能对其各
个成员分别输出。 • ( 2) 对成员变量可以像普通变量一样进行各种运算。例如: • sumage = stu1. age + stu2. age; • (3) 既可以引用成员的地址, 也可以引用结构体变量的地址。例如: • printf("score = %f",stu2. score); • (4) 若成员本身还属于一个结构体类型, 则只能对最低级的成员进行赋
给出结构变量。 • 三种方法中声明的stu1、stu2 变量都具有图10. 1 所示的结构。
上一页 下一页 返回
10. 1 结构体数据
• 这说明变量stu1、stu2 为student 类型后, 即可向这两个变量中的各 个成员赋值。在上述结构体定义中, 所有成员都是基本数据类型或数 组类型。
• 【注意】 • (1) 类型与变量是不同概念, 不要混淆。 • (2) 结构体中的成员, 可以单独使用, 其作用与地位相当于普通变量。 • (3) 成员也可以是一个结构体变量。 • (4) 成员名可以与程序中的变量名相同, 二者不代表同一对象。
• };
• 在这个结构体数据类型定义中, struct 是C 语言关键字, student 是结 构体名, 该结构体由5 个成员组成。第1 个成员为num, 字符串变量; 第2 个成员为name, 字符串变量; 第3个成员为age, 整型变量; 第4 个 成员为sex, 字符变量; 第5 个成员为score, 实型变量。
下一页 返回
10. 1 结构体数据
• 例如, 上述学生信息数据的描述可以定义结构体数据类型为
• struct student

C语言 选择题库第10章 结构体与共用体

C语言 选择题库第10章 结构体与共用体

第10章结构体与共用体1.以下叙述中错误的是()。

A) 可以通过typedef增加新的类型B) 可以用typedef将已存在的类型用一个新的名字来代表C) 用typedef定义新的类型名后,原有类型名仍有效D) 用typedef可以为各种类型起别名,但不能为变量起别名参考答案:A【解析】关键字typedef的作用只是将C语言中的已有的数据类型作了置换,并不是增加新的类型,所以A)错误。

2.以下关于typedef的叙述错误的是A) 用typedef可以增加新类型B) typedef只是将已存在的类型用一个新的名字来代表C) 用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名D) 用typedef为类型说明一个新名,通常可以增加程序的可读性参考答案:A【解析】typedef并不是增加了新类型,而是用一个新名字替代已存在的类型,不能为变量说明一个新名,使用typedef可以增强移植性。

所以A选项错误。

3.若有以下语句typedef struct S{ int g; char h; } T;以下叙述中正确的是A) 可用S定义结构体变量B) 可用T定义结构体变量C) S是struct 类型的变量D) T是struct S类型的变量参考答案:B【解析】本题考查typedef重新声明一种结构体类型,那么T为结构体类型,而不是结构体变量,所以B选项正确。

4.设有以下语句typedef struct TT{ char c; int a[4]; } CIN;则下面叙述中正确的是A) CIN是struct TT类型的变量B) TT是struct类型的变量C) 可以用TT定义结构体变量D) 可以用CIN定义结构体变量参考答案:D【解析】本题考查typedef重新声明一种结构体类型,其中CIN为结构体类型名,而不是结构体变量,所以D 选项正确。

5.以下叙述中错误的是A) 可以用typedef将已存在的类型用一个新的名字来代表B) 可以通过typedef增加新的类型C) 用typedef定义新的类型名后,原有类型名仍有效D) 用typedef可以为各种类型起别名,但不能为变量起别名参考答案:B【解析】本题考查typedef的用法,typedef并不是增加一种新的类型,而是对已存在的类型用一个新的名字来代表,所以B选项错误。

第10章结构体与共用体

第10章结构体与共用体

一般形式:
struct { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列; 用无名结构体直接定义 变量只能一次
10/31/2018
江苏海事职业技术学院-------第10章 结构体与共用体
说明:
结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆 结构体类型及变量的作用域与生存期
struct [结构体名] { 类型标识符 成员名; 类型标识符 成员名; ……………. };
合法标识符 可省:无名结构体 成员类型可以是 基本型或构造型
struct是关键字, 不能省略
10/31/2018
江苏海事职业技术学院-------第10章 结构体与共用体
num
2字节

name
20字节 1字节 2字节 4字节
10/31/2018
江苏海事职业技术学院-------第10章 结构体与共用体
10.8 共用体
共用体类型定义 定义形式:
union 共用体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. };
****类型定义不分配内存
例 union data { int i; char ch; float f; };
10/31/2018
江苏海事职业技术学院10章 结构体与共用体
用typedef定义类型
功能:用自定义名字为已有数据类型命名 类型定义简单形式: typedef type name; 例 typedef int INTEGER; 例 typedef float REAL; 例 INTEGER a,b,c; REAL f1,f2;

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.定义结构体类型变量说明结构变量有以下三种方法。

结构体与共用体讲课文档

结构体与共用体讲课文档
{
sum[0] = sum[0] + pt->scoreComputer; sum[1] = sum[1] + pt->scoreEnglish;
sum[2] = sum[2] + pt->scoreMath; sum[3] = sum[3] + pt->scoreMusic; } for (i=0; i<4; i++)
int i;
char *name[]={"score of Computer","score of English",
"score of Math","score of Music"};
pt = stu; /*pt指向结构体数组的第一个元素*/ for (pt=stu; pt<stu+30; pt++)
第6页,共38页。
数组的解决方法
数据的内存管理方式
1
2 3 4 ……
90 78 89 78 ……
令狐冲 林平之 岳灵珊 任莹莹 ……
83 92 72 95 ……
男 男 女 女 ……
72 88 98 87 ……
1999 1999 1999 1999 ……
82 78 66 90 ……
第7页,共38页。
– 我们可以用sizeof来获得结构的大小
char int char
m1 m2 m3
char
m1
int char
m2 m3
第16页,共38页。
结构体指针
struct point {
int x; int y; };
ppt

结构体与共用体

结构体与共用体

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

结构体和共用体 注意事项

结构体和共用体 注意事项

结构体和共用体注意事项以结构体和共用体为主题,本文将介绍一些需要注意的事项。

结构体和共用体是C语言中非常重要的数据类型,它们可以用来组织和存储不同类型的数据。

在使用结构体和共用体时,需要注意以下几点。

一、结构体的定义和使用结构体是一种自定义的数据类型,它能够将不同类型的数据组合在一起。

在定义结构体时,需要使用关键字struct,并为结构体定义一个名称。

结构体中的成员可以是不同的数据类型,可以是基本类型(如int、float等),也可以是其他结构体类型。

在使用结构体之前,需要先定义结构体的类型。

定义结构体类型的方式如下:```struct Student {char name[20];int age;float score;};```在定义结构体类型后,可以使用该类型创建结构体变量,并对结构体的成员进行赋值。

例如:```struct Student stu1;strcpy(, "Tom");stu1.age = 18;stu1.score = 90.5;```需要注意的是,在访问结构体的成员时,需要使用点操作符(.)来访问成员。

例如,访问stu1的name成员可以使用``,访问stu1的age成员可以使用`stu1.age`。

二、共用体的定义和使用共用体(union)与结构体类似,也是一种自定义的数据类型,可以将不同类型的数据组合在一起。

不同之处在于,共用体的所有成员共享同一块内存空间。

共用体的定义方式与结构体类似,也需要使用关键字union,并为共用体定义一个名称。

共用体中的成员可以是不同的数据类型,但是共用体的所有成员共享同一块内存空间。

使用共用体时,需要注意以下几点:1. 共用体的所有成员占用的内存空间是相同的,因此共用体的大小等于最大成员的大小。

2. 在给共用体的成员赋值时,只能对一个成员进行赋值,对其他成员的赋值会改变已经赋值的成员的值。

下面是一个共用体的定义和使用的示例:```union Data {int num;char ch;float score;};```在定义共用体类型后,可以使用该类型创建共用体变量,并对共用体的成员进行赋值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第十章结构体与共用体一、选择题1.在说明一个结构体变量时系统分配给它的存储空间是。

(0级)A)该结构体中第一个成员所需存储空间B)该结构体中最后一个成员所需存储空间C)该结构体中占用最大存储空间的成员所需存储空间D)该结构体中所有成员所需存储空间的总和2.若有以下说明和语句:struct worker{ int no; char ﹡name; }work, ﹡p=&work;则以下引用方式不正确的是。

(1级)A) work.no B) (﹡p).no C) p->no D)work->no3.有如下定义:struct date { int year, month, day; };struct worklist { char name[20]; char sex;struct date birthday; }person;对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。

(1级)A) year=1958 B) birthday.year=1958C) person.birthday.year=1958 D) person.year=19584.以下对结构体类型变量的定义中不正确的是。

(1级)A)#define STUDENT struct student B) struct studentSTUDENT { int num;{ int num; float age;float age; }std1; }std1;C) struct D) struct{ int num; { int num;float age; float age; } student;}std1; struct student std1;5.设有以下说明语句struct stu{ int a; float b; }stutype;则下面的叙述不正确的是。

(1级)A)struct是结构体类型的关键字B)struct stu是用户定义的结构体类型C)stutype是用户定义的结构体类型名D)a和b都是结构体成员名6.C语言结构体类型变量在程序执行期间。

(0级)A)所有成员一直驻留在内存中B)只有一个成员主留在内存中C)部分成员驻留在内存中D)没有成员驻留在内存中7.以下程序的运行结果是。

(1级)# include <stdio.h>main( ){ struct date{ int year, month, day; }today;printf(“%d\n”,sizeof(struct date)); }A) 6 B) 8 C) 10 D)128.有如下定义struct person{char name[9]; int age;};stru ct person class[10]={“Johu”, 17,“Paul”, 19“Mary”, 18,“Adam 16,};根据上述定义,能输出字母M的语句是。

(1级)A)prinft(“%c\n”,class[3].mane);B)pfintf(“%c\n”,class[3].name[1]);C)prinft(“%c\n”,class[2].name[1]);D)printf(“%^c\n”,class[2].name[0]);9.设有如下定义struct ss{ char name[10];int age;char sex;} std[3],* p=std;下面各输入语句中错误的是。

(1级)A) scanf("%d",&(*p).age);B) scanf("%s",&);C) scanf("%c",&std[0].sex);D) scanf("%c",&(p->sex))10.设有以下说明语句,则下面的叙述中不正确的是。

(1级)struct ex {int x ; float y; char z ;} example;A) struct结构体类型的关键字B) example是结构体类型名C) x,y,z都是结构体成员名D) struct ex是结构体类型11.若程序中有下面的说明和定义:struct stt{ int x;char b;}struct stt a1,a2;则会发生的情况是。

(1级)A)程序将顺利编译、连接、执行。

B)编译出错。

C)能顺利通过编译、连接,但不能执行。

D)能顺利通过编译,但连接出错。

12.已知教师记录定义为:struct student{ int no;char name[30];struct{ unsigned int year;unsigned int month;unsigned int day;}birthday;} stu;struct student *t = &stu;若要把变量t中的生日赋值为“1980年5月1日”,则正确的赋值方式为。

(1级)A) year = 1980; B) t.year = 1980;month = 5; t.month = 5;day = 1; t.day = 1;C) t.birthday.year = 1980; D) t-> birthday.year = 1980;t.birthday.month = 5; t-> birthday.month = 5;t.birthday.day = 1; t-> birthday.day = 1;13.以下结构类型可用来构造链表的是。

(1级)A)struct aa{ int a;int * b;};B)struct bb{ int a;bb * b;};C)struct cc{ int * a;cc b;};D)struct dd{ int * a;aa b;};14.以下程序的输出结果是。

(2级)amovep(int *p, int a[3][3],int n){ int i, j;for( i=0;i<n;i++)for(j=0;j<n;j++){ *p=a[i][j];p++; }}main(){ int *p,a[3][3]={{1,3,5},{2,4,6}};p=(int *)malloc(100);amovep(p,a,3);printf("%d %d \n",p[2],p[5]);free(p);}A)56 B)25 C)34 D) 程序错误15.以下程序的输出结果是。

(2级)struct HAR{ int x, y; struct HAR *p;} h[2];main(){ h[0].x=1;h[0].y=2;h[1].x=3;h[1].y=4;h[0].p=&h[1].x;h[1].p=&h[0].x;printf("%d %d \n",(h[0].p)->x,(h[1].p)->y);}A)12 B)23 C)14 D)32二、填空题1.有如下定义:(1级)struct {int x; int y; }s[2]={{1,2},{3,4}}, ﹡p=s;则:表达式++p->x 的结果是。

表达式++p->x 的结果是。

2.若有定义:(2级)struct num {int a; int b; float f; }n={1, 3, 5.0}};struct num ﹡pn=&n;则表达式pn->b/n.a﹡++pn->b的值是,表达式(﹡pn).a+pn->f的值是。

3.若要使指针p指向一个double类型的动态存储单元,请填空。

(1级)p= malloc(sizeof(double));4.设有以下结构类型说明和变量定义,则变量a在内存所占字节数是。

(1级)Struct stud{ char num[6];int s[4];double ave;} a,*p;三、程序填空题1.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。

请填空。

(1级)static struct man{ char name[20]; int age; }person[ ]={ “li-ming”,18, “wang-hua”,19,”zhang-ping”,20};main( ){struct man *p,*q; int old=0; p=person; for( ; (1))if(old<p->age) {q=p; (2);}printf(“%s %d”, (3)); }2.以下程序段的功能是统计链表中结点的个数,其中first为指向第一个结点的指针(链表不带头结点)。

请填空。

(1级)struct link{char data; struct link *next; };……struct link * p, * first; int c=0; p=first;while ( (1)) { (2); p= (3); }3.已知head 指向一个带头结点的单向链表,链表中每个结点包含数据域(data)和指针域(next),数据域为整型。

以下函数求出链表中所有链结点数据域的和值,作为函数值返回。

请填空。

(2级)struct link{int data; struct link *next; };main( ){ struct link *head;...sum(head);...}sum( (1)){ struct link *p; int s=0;p=head->next;while(p) {s+= (2); p= (3); }return(s);}4.已知head指向单链表的第一个结点,以下函数完成往降序单向链表中插入一个结点,插入后链表仍有序。

请填空。

(2级)# include <stdio.h>struct student{int info; struct student *link; };struct student *insert(struct student * head, struct student * stud){ struct student * p0, * p1, * p2; p1=head; p0=stud;if(head= =NULL) {head=p0; p0->link=NULL;}else while(p0->info<p1->info)&&(p1->link!=NULL)){p2=p1; p1=p1->link; }if(p0->info>=p1->info) { if(head= =p1) { (1); head=p0; }else {p2->link=p0; (2); }}else {p1->link=p0; (3); } return(head);}四、读程序写结果题1.以下程序的运行结果是。

相关文档
最新文档