当前位置:文档之家› 结构体与共用体

结构体与共用体

结构体与共用体
结构体与共用体

第11章结构体与共用体

本章主要考查结构体类型、结构体变量、结构体数组、结构体指针的定义和引用方法,结构体类型变量的特点,以及共用体及枚举类型的概念、定义和引用,并掌握己有类型定义别名的方法。

一、考试要点

1、结构体

(1)结构体类型的定义

结构是一种“构造”而成的数据类型,在使用之前必须先定义,然后才可能用来定义相应的变量、数组等。定义如下:

struct 结构名

{

成员列表;

};

例如:

struct std

{

int num;

char name[10];

float sco;

};

定义的该结构类型之后,这种类型在内存中所占间为所有成员所占内存之和。

(2)结构类型的说明

说明结构体变量有以下3种方法:

方法一:先定义结构体,再说明结构体变量

struct std

{

int num;

char name[10];

float sco;

};

struct std stu1,stu2;

方法二:在定义结构体的同时说明结构体变量

struct std

{

int num;

char name[10];

float sco;

}stu1,stu2;

方法三:直接说明结构变量

struct

{

int num;

char name[10];

float sco;

}stu1,stu2;

(3)结构变量的引用

结构变量成员的表示一般形式为:

结构变量名.成员名

如:stu1.sco

若成员本身又是一个结构,则必须逐级找到最低级的成员才可以使用,一般形式为:

外层结构变量.外层成员名.内层成员名

如:stu1.birth.year

(4)结构变量和赋值和初始化

结构变量的赋值即是给各个成赋值,可用输入输出语句来实现。

结构变量的初始化是指在结构变量说明的同时,给它的各个成员赋初值,初始化的格式为:struct 结构名

{结构成员列表;}

结构变量={初始数据表};

(5)结构指针变量的说明和使用

结构指针的说明形式为:

struct 结构名* 结构指针变量名

结构指针变量访问结构变量各个成员的一般形式为:

(*结构指针变量).成员名

结构指针变量->成员

2、共用体

(1)共用体类型的定义和共用体变量的说明

其定义方法为:

union 共用体名

{

成员表;

};

如:

union unit

{ int class;

char office[10];

};

共用体类型在内存中所占空间等于成员中占空间最大的。

共用体变量的说明的方法与结构体变量的说明方法相同。

(2)共用体类型变量的赋值和使用

形式为:

共用体变量.成员名

3.枚举类型

枚举类型的定义形式为:

enum枚举名

{枚举值表;};

枚举类型变量的说明与结构体和共用体相同。

4.类型定义符typedef

用typedef来给已知类型取别名。

如: typedef int INTEGER

这样,int a,b;与INTEGER a,b;的功能是一样的.

二、典型例题分析

例10.1设有结构体及其数组和指针变量的定义语句

struct {int x;}y[2],*p=y;则下列表达式中不能正确表示结构体成员的是( )( 2005年1月份安徽省计算机水平考试二级《C语言程序设计》试题)

A)(*p).x B)*(p+1).x C)y[0].x D)(&y[1])->x

答案:B

解析:.优先级高于*,因此B相当于*((p+1).x),而p+1为地址,不能使用.来引用结构体成员,则B错误

例10.2 以下语句中,指针p的data域正确的引用方式为()

typedef struct mode

{ int data;

struct node *lchild, *rchild;

} Btree;

Btree *p;

(2005年12月份安徽省计算机水平考试二级《C语言程序设计》试题)

A)p.data B)p->data C)(*p)->data D)p[data]

答案:B

解析:p为指向Btree的指针,则引用data域方法为p->data

例10.3 union stu{int I;float t;int a[4]}x;则x在内存中占用的字节数是( ) ( 2006年6月份安徽省计算机水平考试二级《C语言程序设计》试题)

A)2 B)4 C)8 D)14

答案:C

解析:int为2个字节,float为4个字节,数组a为4*2=8个字节,union类型的变量所占字节数即为最长的域所占字节数。

例10.4 如有以下定义

struct person {char name[9];int age;};

struct person class[10]={“John”,17,”Paul”,19,”Mary”,18,”Adam”,16};

根据上述定义,能输出字母M的语句是( ) ( 2007年1月份安徽省计算机水平考试二级《C 语言程序设计》试题)

A)printf(“%c\n”,class[3].name); B)printf(“%c\n”,class[3].name[1]);

C)printf(“%c\n”,class[2].name[1]); D)printf(“%c\n”,class[2].name[0]);

答案:D

解析:John和17为class[0]两个域的取值,Paul和19为class[1]两个域的取值,Mary和18为class[2]两个域的取值。字母M在”Mary”字符串的首位。帮D正确。

例10.5若有以下结构体定义:

struct example

{

int x;

int y;

}v1;

则()是正确的引用或定义。

A)example.x=10; C)example v2;v2.x=10;

B)struct v2.x=10; D) struct example v2={10};

答案:D)

解析:此题考察基本的结构体定义和应用方法。选项A)的错误是通过结构体名引用结构体成员,选项B)的错误是将结构体名使用,选项C)的错误是将关键字stuuct 作为类型名使用。选项D)是定义便量v2 并对其初始化的语句,初始值只有前一部分,这是允许的。

例10.6 下述程序的执行结果是()。

#include

union un

{

int I;

char c[2];

}

main()

{

union un x;

x.c[10]=10;

x.c[1]=1;

printf(“\n%d”,x.i);

}

A) 266 B)11 C)256 D)138

答案:A)

解析:此题考查共用体的特征。Int 类型变量I和字符数组c共用两个字节的存储单元,通常c[0]位于低字节,c[1]位于高字节。因此,x,I=x.c[1]*256+x.c[0]=266,故选项A)正确。例10.7 根据下列定义能输出字母M的语句是()。

struct person{ char name[9]; int age ;} ;

struct person class[10] = {“Johu ”,17,”Paul ”.19,”Mary”,18,”Adam”,16};

A)printf(“%c\n”,class[3].name);

B)printf(“%c\n”,class[3].name[1];

C)printf(%”c\n”,class[2].name[1] );

D)printf(“%c\n”,class[2].name[0]);

答案:D)

解析:class是一个含有10个元素的数组,每个元素都是一个struct person 类型的结构体变量。在class的定义语句中已给class[0]~class[3]元素赋了初值,在class[0] .name 中存放的字符串“Johu”,在class[0].age中存放了整数17.由定义语句可以看到,只有在class[2].Name 中存放的字符串“Mary”中含有大写字母M,且在字符串的开头,因此,选项D)中的语句输出的是字母M,总结:class[2].name中,name是一个字符数组名,通过赋值在其中放如字符串“Mary”,因此可以通过数组元素class[2].name[0]来引用其中的首字符。

例10.8 以下程序的输出是()。

#include

main( )

{

struct cmplx{ int x ;int y ;} cnum[2]= {1,3, 2, 7 };

printf (“% d\n”,cnum[0]. X*cunm[1].x );

}

A)0 B)1 C)3 D)6

答案:D)

解析:程序定义了一个名为cnum的含有两个元素的结构体类型数组,结构体类型为struct cmplx, cnum的每个元素含有两个成员。在定义cnum的同时给它的元素赋初值,cnum[0].x

的初值是1,cnum[0].y 的初值是3,cnum[1].x的初值是2,cnum[1].y的初值是7。因此printf输出项中的表达式可代入为3/1*2,输出结果是6。总结:对结构体变量(或数组)赋初值时,C编译程序按每个成员在内码中排列的顺序,一一对应赋予初值表中的值。

例10.9 已知字符0的ASCII代码值的十进制数是48,以下程序:

#include

main()

{

union{ int i[2];

long k;

char c[4];

}r,*s=&r;

s->i[0]=0x39; s-.i[1]=0x38;

printf(“%x\n”),s->c[0]);

}

其输出结果是()。

A)39 B)9 C)38 D)8

答案:A)

解析:在共用体变量中,所有成员共用存储空间。因此变量r中,成员i[0]和成员c[1]共用2字节的存储空间,c[0]和c[1]都占1字节,因此,c[0]与i[0]的低8位共用1字节,而c[1]与i[0]的高8位共用1字节。程序以十六进制数的形式输出s->c[0]的值,因此我们只需求出在i[0]的低8位中的值即可。程序有赋值语句:s->i[0]=0x39;s->i[1]=0x38;,根据以上分析,我们只需关心s->i[0]=0x39;的赋值即可。因为c[0]与i[0]的低8位共用1字节,所以s->c[0]的十六进制数就是39。

结构体与共用体

试卷编号:825 所属语言:C语言 试卷方案:结构体与共用体 试卷总分:90分 共有题型:5种 ━━━━━━━━━━━━━━ 一、填空共5题(共计10分) ━━━━━━━━━━━━━━ 第1题(2.0分)题号:205 结构体是不同数据类型的数据集合,作为数据类型, 必须先说明结构体【1】,再说明结构体变量. 答案: =======(答案1)======= 类型 第2题(2.0分)题号:208 将函数funl 的入口地址赋给指针变量p的语句是【1】. 答案: =======(答案1)======= p=funl; 第3题(2.0分)题号:232 设有以下结构类型说明和变量定义,且sizeof(int)=2,则变量a在内存所占字节数是【1】. struct stud { char num[6]; int s[4]; double ave; } a,*p; 答案: =======(答案1)======= 22

第4题(2.0分)题号:345 若在程序中用到"strlen()"函数时,应在程序开头写上包含命令# include "【1】". 答案: =======(答案1)======= string.h 第5题(2.0分)题号:803 预处理命令行都必须以【1】号开始. 答案: =======(答案1)======= # ━━━━━━━━━━━━━━━━━ 二、单项选择共20题(共计40分) ━━━━━━━━━━━━━━━━━ 第1题(2.0分)题号:464 以下描述中,正确的是()。 A:预处理是指完成宏替换和文件包含中指定的文件的调用 B:预处理指令只能位于C源文件的开始 C:C源程序中凡是行首以#标识的控制行都是预处理指令 D:预处理就是完成C编译程序对C源程序第一遍扫描,为编译词法和语法分析作准备答案:C 第2题(2.0分)题号:472 下列程序运行结果为: #define P 3 #define S(a) P*a*a main() {int ar; ar=S(3+5); printf("\n%d",ar); } A:192 B:29 C:27

第10章 结构体及共用体

第10章结构体与共用体 考核知识点 ●结构体与共用体类型数据的定义方法和引用方法 ●用指针和结构体构成链表,单向链表的建立、输出、插入与删除 重要考点 ●对结构体的声明及定义 ●访问结构体的成员的方法 ●熟悉对链表的操作 10.1 用typedef说明一种新类型名 C语言规定可以用typedef说明一种新的类型名,说明新类型名的语句一般形式为:typedef 类型名称标识符; 其中,“类型名”一定是在此语句之前已有定义的类型标识符。“标识符”是一个用户定义标识符,用来标识新的类型名。typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并没有产生新的数据类型,因此,原有的类型名依然有效。 提示: 声明一个新的类型名的具体步骤如下: ⑴先按定义变量的方法写出定义的主体(如float a;). ⑵将变量名换成新类型名(如将a换成FLO)。 ⑶在最左面加上关键字typedef(如typedef FLO). ⑷然后可以用新类型名去定义其他的变量(如FLO b;). 10.2 结构体类型 在实际工作中,当我们需要把一些不同类型,但相互之间又存在着联系的信息组合应用时,就要用到结构体。结构体是一种看似复杂却非常灵活的构造数据类型。在通常情况下,一个结构体类型由若干个称为成员(或称为域)的部分组成。不同的结构体类型可根据需要由不同的成员组成。但对于某个具体的结构体类型,其成员的数量必须固定,这一点与数组相同;但结构体中各个成员的类型可以不同,这是结构体与数组的重要区别。例如,我们常用的“时间”可以由以下3个部分描述:小时(hour)、分(minute)、秒(second)。它们都可以用整型数表示,可以把这3个成员组成一个整体,并给它取名为time,这就是一个简单的结构体。 声明一个结构体类型的一般形式为: struct 结构体名 {成员表列}; struct是C语言中的关键字,是结构体类型的标志。“结构体名”用做结构体类型的标志,它又称“结构体标记”(structure)。大括号内是该结构体中各成员,成员表列是由若干个变量类型名及变量名组成的。这些成员共同组成一个结构体。例如,上面提到的“时间”结构体类型可以说明如下: struct time { int hour; int minute; int second;

第11章 结构体与共用体

第十一章结构体与共用体 结构体变量引用规则: (1)不能将一个结构体变量作为一个整体进行输入和输出;只能对结构体变量中的各个成员分别进行输入和输出。“.”是成员(分量)运算符,它在所有的运算符中优先级最高。 (2)若成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。 (3)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。 (4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。 —>是指向运算符,优先级为第一级。 结构体变量所占的内存长度是各成员所占内存长度之和。每个成员分别占有其自己的内存单元。 共用体变量所占的内存长度等于最长的成员的长度。 只先有定义了共用体变量才能引用它,而且不能引用共用体变量,而只能引用共用体变量中的成员。 将一个变量定义为结构体类型:不仅要求指定变量为结构体类型,而且要求指定为某一特定结构体类型。 类型与变量的区别: 定义时先定义结构体类型,然后定义变量。类型不分配空间,变量分配空间。 可以采取以下3种方法定义结构体类型变量: (1)先声明结构体类型再定义变量名 例如:struct student student1, student2; | | | 结构体类型名结构体变量名 (2)在声明类型的同时定义变量;这种形式的定义的一般形式为: struct 结构体名 { 成员表列 }变量名表列; (3) 直接定义结构体类型变量 其一般形式为: struct { 成员表列 }变量名表列; 即不出现结构体名。 引用结构体变量中成员的方式为 结构体变量名.成员名

结构体与共用体小结

结构体与共用体小结 一,结构体得概念与定义 1,结构体得定义 struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }; 这里数据类型可以就是复合类型,例如又就是一个结构体类型,即嵌套; 2,结构体变量得定义 struct 结构体名变量名1,变量名2,,,变量名n; 或: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2;

或: struct { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2; 三种方式,第三种方式得话,每次要定义这个类型得结构体变量都要重复得写这一段代码; 其实定义了结构体后,struct 结构体名就就是一种新得类型,上述语句就像声明变量一样; 3,结构体变量得引用 只能对结构体变量中得各个成员分别输出,不能对一个结构体变量作为一个整体输出; 嵌套得结构体类型得引用: 结构体变量名、结构体类型成员名、内嵌结构体得成员名; 4,结构体变量得初始化 struct 结构体名变量名= {初始化数据};

或者在定义得时候就初始化: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }变量名= {初始化数据}; 二,结构体数组 1,结构体数组得定义举例struct stu { int stu_nu; char name[20]; float score; }; struct stu student[5]; 或者: struct stu { int stu_nu;

char name[20]; float score; }student[5]; 或者: struct { int stu_nu; char name[20]; float score; }student[5]; 跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一个数组;每一个student[i]都就是struct stu类型得; 2,结构体数组得初始化与引用 略; 三,结构体与指针 1,指向结构体得指针得定义,同上,也就是三种形式; struct employees employee1,*p1; 或者: struct employees

结构体和共用体习题

习题六 1. 从下列四个选项中选择一个正确的填入括号中。 (1)在说明一个结构体变量时系统分配给它的存储空间是(D)。 A该结构体中第一个成员所需存储空间 B该结构体中最后一个成员所需存储空间 C该结构体中占用最大存储空间的成员所需存储空间 D该结构体中所有成员所需存储空间的总和 (2)在说明一个共用体变量时系统分配给它的存储空间是(D )。 A该共用体中第一个成员所需存储空间 B该共用体中最后一个成员所需存储空间 C该共用体中占用最大存储空间的成员所需存储空间 D该共用体中所有成员所需存储空间的总和 (3)共用体类型在任何给定时刻, (B)。 A所有成员一直驻留在内存中 B只有一个成员驻留在内存中 C部分成员驻留在内存中 D没有成员驻留在内存中 (4)以下定义结构体类型的变量st1,其中不正确的是(A ) A typedef stuct student { int num; int age; }STD; STD st1; B struct student { int num,age; }st1; C struct { int num; float age; }st1; D struct student { int num; int age; }; struct student st1; (5)已知职工记录描述为: struct workers {

int no; char name[20]; char sex; struct { int day; int month; int year; }birth; }; struct workers w; 设变量w中的”生日”应是”1993年10月25日”,下列对”生日”的正确赋值方式是(C)。 A day=25; month=10; year=1993; B w.day=25w.month=10; w.year=1993; C w.birth.day=25; w.birth.month=10; w.birth.year=1993; D birth.day=25; birth.month=10; birth.year=1993; (6)设有如下定义: struct sk { int a; float b; }data,*p; 若有p=&data;则对data中的a成员的正确引用是(B)。 A (*p).data.a B (*p).a C p->data.a D p.data.a 2.填空 (1)若有以下说明和定义且数组w和变量k已正确赋值,则对w数组中第k个元素中各成员的正确引用形式是w[k-1].b、w[k-1].c 、w[k-1].d 。 struct aa { int b; char c; double d; }; struct aa w[10]; int k=3; (2)若有以下说明和定义,则对x.b成员的另外两种引用形式是x->b-> 和p.b. 。 struct st { int a; struct st *b; }*p, x;

练习题-第十章 结构体与共用体(有答案)

一、填空题 1.若有如下结构体定义: struct student { int num; float age; char sex; }stud; 则stud所占的内存空间是9 字节。 2.已有定义和语句: union data { int i; char c; float f; }a,*p; p=a; 则对a中成员c的正确访问形式可以是 a.c 或: p->c或:(*p).c。(只需 写出一种) 二、单项选择题: 1.若有下列定义: struct b { float a[5]; double c; int d;}x; 则变量x在内存中所占的字节为下列哪一个:( C ) A.6 B. 10 C. 30 D. 14 2.设有以下说明语句,则下面的叙述不正确的是( C ) struct stu { int a; float b; } stutype; A. struct 是结构体类型的关键字。 B. struct stu 是用户定义的结构体类型。 C. stutype是用户定义的结构体类型名。 D. a和b都是结构体成员名。 3.下面程序的运行结果是( ) #include main( ) { struct date { int year, month, day;

}today; printf(“%d\n”,sizeof(struct date)); } A. 6 B. 8 C. 10 D. 12 4.设有以下说明语句,则下面的叙述正确的是( B ) typedef struct { int a; float b; } stutype; A. stutype是结构体变量名。 B. stutype 是结构体类型名。 C. struct是结构体类型名。 D. typedef struct是结构体类型名。 三、填程序 1.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。请填 空。 static struct man { char name[20]; int age; }person[ ]={{“LiMing”,18},{“WangHua”,19},{“ZhangPing”,20}}; main( ) { struct man *p,*q; int old=0; p=person; for(; p age){ q=p; old=p->age ;} printf(“%s %d”, q->name,q->age ); }

第十一章结构体的试题

(1)()是关于C语言数据类型的正确叙述。 A) 枚举类型不是基本类型 B) 变量使用前应定义相应的数据类型 C) 不允许使用空类型 D) 数组不是构造类型 (2) 下列()对结构类型变量定义是错误的。 A) struct teacher { int num; int age; }; struct teacher teach1; B) struct { int num; int age; } teach1, teach2; C) struct { int num; int age; } teacher; struct teacher teach1; D) struct teacher { int num; int age; } teach1; (3) 若有定义: char ch; int j,k; enum day {sun, mon, tue, wed, thu, fri, sat}; int a[sat]; 则()对下列语句是否符合语法规则的判断是正确的。 sun=0; /*语句1*/ j=mon+tue; /*语句2*/ if (a[mon]>0) j++; /*语句3*/ A) 语句1、2、3均正确 B) 语句2正确,语句1和语句3错误 C) 语句1错误,语句2和语句3正确 D) 语句1、2、3均错误 (4) 若有定义: struct teacher { int num; char sex;

int age; } teacher1; 则下面叙述错误的是()。 A) teacher1是结构类型名 B) struct teacher是用户定义的结构类型 C) num、sex、age都是结构变量teacher1的成员 D) struct是结构类型的关键字 (5) 下列程序段运行后,表达式()的值为3。 struct point { int x; int y; } *p; struct point a[3]={1,2,3,4,5,6}; p=a; A) p[1].x B) *(p+2) C) p[3].x D) p[2].x (6) 若有定义: typedef int NUM[100]; NUM n; 则()语句是正确的。 A) n[0]=2; B) NUM=2; C) NUM=n; D) n=2; (7) 若有定义int a=1,b=2,t=3; struct data { char a; float b[3]; long c; }d1; 则变量d1的长度是()。 A) 4 B) 17 C) 12 D) 15 (8) 若有定义 struct teacher { int num;

第十一章结构体与共用体

第^一章结构体与共用体教学内容 (1) 结构体的定义与结构体变量; (2) 结构体数组; (3) 结构体指针; ⑷链表; (5) 共用体; (6) 枚举类型; 基本要求 掌握结构体的定义方法及其作用;重点掌握链表及其应用了解共用体的概念及其应用

一、概述 、引入原由 我们前面讲过数组,数组类型中的各个元素的类型是相同的,在日常应用中,仅仅有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。例如:学生的信息(姓名、性别、年龄、成绩、学号)。那么如何实现这种结构呢?采用的是结构体。 女口:struct student { int num; char n ame[20]; char sex; int age; float score; }; 、结构体类型的一般形式 struct 结构体名 {成员表列}; 成员表列:类型名成员名 女口:struct student {int nu m;char sex;}; 二、结构体类型变量的定义、引用、初始化 、定义方法 1、先声明类型再定义变量名 struct stude nt {int nu m;char sex;}; struct stude nt stu1,stu2; 2、在声明类型的同时定义变量 struct stude nt {int nu m;char sex;} stu1,stu2; 3、直接定义结构体类型变量(不给出结构体名) struct {int nu m;char sex;} stu1,stu2; 4、说明: 1 )类型与变量不同(变量:分配空间,可以赋值、存储、运算) 2)成员与普通变量地位相当,域名可以单独使用 3)成员也可以是一个结构体变量 如: struct date

结构体与联合体习题含答案

2013年结构体与联合体习题 选择题 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行 C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连 接出错 2、有以下程序段 struct st { int x; int *y;}*pt; int a[]={1,2};b[]={3,4}; struct st c[2]={10,a,20,b}; pt=c; 以下选项中表达式的值为11的是 A) *pt->y B) pt->x C) ++pt->x D) (pt++)->x 3、有以下说明和定义语句 struct student { int age; char num[8];}; struct student stu[3]={{20,"200401"},{21,"200402"},{19,"200403"}}; struct student *p=stu; 以下选项中引用结构体变量成员的表达式错误的是______。 A) (p++)->num B) p->num C) (*p).num D) stu[3].age 4、设有如下枚举类型定义 enum language {Basic=3,Assembly=6,Ada=100,COBOL,Fortran}; 枚举量Fortran的值为______。 A) 4 B) 7 C) 102 D) 103 5、以下叙述中错误的是_________。 A)可以通过typedef增加新的类型 B)可以用typedef将已存在的类型用一个新的名字来代表 C)用typedef定义新的类型名后,原有类型名仍有效 D)用typedef可以为各种类型起别名,但不能为变量起别名 6、有以下程序段 typedef struct NODE

结构体与共用体小结

结构体与共用体小结 一,结构体的概念和定义 1,结构体的定义 struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }; 这里数据类型可以是复合类型,例如又是一个结构体类型,即嵌套; 2,结构体变量的定义 struct 结构体名变量名1,变量名2,,,变量名n; 或: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }结构体变量1,结构体变量2;

或: struct { 数据类型成员名1; 数据类型成员名1; ... }结构体变量1,结构体变量2; 三种方式,第三种方式的话,每次要定义这个类型的结构体变量都要重复的写这一段代码; 其实定义了结构体后,struct 结构体名就是一种新的类型,上述语句就像声明变量一样; 3,结构体变量的引用 只能对结构体变量中的各个成员分别输出,不能对一个结构体变量作为一个整体输出; 嵌套的结构体类型的引用: 结构体变量名.结构体类型成员名.嵌结构体的成员名; 4,结构体变量的初始化 struct 结构体名变量名= {初始化数据};

或者在定义的时候就初始化:struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }变量名= {初始化数据}; 二,结构体数组 1,结构体数组的定义举例struct stu { int stu_nu; char name[20]; float score; }; struct stu student[5]; 或者: struct stu { int stu_nu;

char name[20]; float score; }student[5]; 或者: struct { int stu_nu; char name[20]; float score; }student[5]; 跟定义结构体变量的三种形式是一样的,只不过这里每次定义的结构体变量是一个数组;每一个student[i]都是struct stu类型的; 2,结构体数组的初始化和引用 略; 三,结构体与指针 1,指向结构体的指针的定义,同上,也是三种形式; struct employees employee1,*p1; 或者: struct employees

第10章练习 结构体

7.2典型例题分析与解答 例题1:下列结构体定义,正确的是()。 A.B. record { struct record { int no; int no; char num[16]; char num[16]; float score ; float score ; } ; } C.D. struct record { struct record { int no; int no char num[16]; char num[16] float score ; } ; float score } 答案:C 分析:结构体类型定义必须以关键字struct 开头,即A不正确,不能选择。D中结构体中定义成员语名没有用分号结束,故不正确,不能选择D。根据结构体类型说明形式要求必须用分号结束,所以B和C中,只能选择C。 例题2:下列声明结构体变量错误的是()。 A.struct student B.struct student {{ int no; int no; char name[16]; char name[16]; }st1,st2; }; struct student st1,st2; C.D. struct student { struct student { int no; int no; char name[16]; char name[16]; }; }; student st1,st2; struct st1,st2; 答案:D 分析:结构体变量定义有两种方式,一是在定义结构体类型时说明结构体变量,如A,即A 是正确的。二是用结构体类型说明结构体变量。如B和C,即B和C也是正确。不能只用结构体关键字去说明结构体变量,即D不正确,只能选择D。 例题3:设有以下说明,则正确的赋值表达式为()。 struct x {int no; char name[20]; float score;} y;

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

第十章结构体与共用体 一、选择题 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=1958 C) person.birthday.year=1958 D) person.year=1958 4.以下对结构体类型变量的定义中不正确的是。(1级) A)#define STUDENT struct student B) struct student STUDENT { 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)没有成员驻留在内存中

c语言结构体与共用体之间的区别

https://www.doczj.com/doc/ed7459271.html,/2005/03/25/12365.html 所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为: union 共用体名 {成员表列}; 7.5.1 共用体的定义 union data { int a ; float b ; d o u b l e c ; c h a r d ; } obj; 该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量o b j。共用体 数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。 [例7 - 8 ] union data /*共用体* / { int a; float b; double c; char d; } m m ; struct stud /*结构体* / { int a; float b; double c; char d; } ; m a i n ( ) { struct stud student printf("%d,%d",sizeof(struct stud),sizeof(union data)); } 程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的

共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7 - 6所示。 对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存 空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。 7.5.2 共用体变量的引用 可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为: union data /*共用体* / { int a; float b; double c; char d; } m m ; 其成员引用为:m m . a , m m . b , m m . c , m m . d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。 [例7-9] 对共用体变量的使用。 m a i n ( ) { union data { int a; float b; double c; char d; } m m ; m m . a = 6 ; printf("%d\n",mm.a); m m . c = 6 7 . 2 ; p r i n t f ( " % 5 . 1 l f \ n " , m m . c ) ; m m . d = ' W ' ; m m . b = 3 4 . 2 ; p r i n t f ( " % 5 . 1 f , % c \ n " , m m . b , m m . d ) ; }

C语言结构体和共用体实验报告

实验九参考程序 实验 9- 1 /**************************************************************** * 实验 9.1 * * ( 1 )为某商店的商品设计合适的结构体 (PRODUCT) 。每一种商品包含编号 (number) 、 * 名称 (name) 、价格 (price) 、折扣 (discount)4 项信息,根据表 9-1 ,为这些信 息选择合适的数据类型。 * (2)建立 2个函数,以实现对商品的操作。 input 函数实现商品的输入; * display 函数显示商品信息。要求这 2个函数都以商品的结构体 (PRODUCT) 指针为 参数。 * (3 )在主函数中为商品键盘定义一个结构体变量 (keyboard) ,利用 input 函数实现键 盘信息的输入; * 定义一个结构体数组 (elec_device[3]) ,利用 input 函数实现冰箱、 空调、电视 信息的输入; * 最后利用 display 函数显示 4 种商品的信息。 * * 表 9-1 #include typedef struct _PRODUCT int iNumber; char strName[32]; float fPrice; float fDiscount; * 编号 名称 价格 折扣 *1010 键盘 89.50 0.85 *1021 冰箱 1024.00 0.95 *1022 空调 2058.50 0.90 *1023 电视 3001.88 0.95 *************************************************************** */

十一章 结构体与共用体

结构体与共用体 一、选择题: 1.已知赋值语句wang.year=2004;则wang的变量类型是() A. 字符或文件 B. 整型或实型 C. 共用或结构 D. 实型或指针 2.Turbo C中,以下类型数据在存储器中占的字节数为 ( ) struct test { int x; float y; char z; } ; A. 2 B. 3 C. 6 D. 7 3.以下语句中,成员data的正确引用方式为( ) struct node { int data; char name[10]; }stree; struct node *p=&stree; A. p.data B. p->data C. (*p)->data D. stree->data 4、当执行以下程序段时,输出的结果是。()struct data { char a; int b; float c; }; printf(“%d”, sizeof(struct data)); A. 1 B. 2 C. 4 D. 7 5.下面程序段的运行结果是。 struct stu { int num; char name[10]; float scrose ; }; printf(“%d\n”, sizeof (struct stu )); (A)14 (B)12 (C)16 (D)3 6. 若有定义: typedef char* string; #define str char * int a=4; struct { int x, *y; }z={10, &a}, *p=&z; 则下列不等价的是: A. string name, sign; 与 str name, sign; B. *p->y++ 与 *(p->y++) C. ++*p->y 与 ++(*p->y) D. ++p->x与++(p->x) ()

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

第十章结构体与共用体 、选择题 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, mon th, day; }; struct worklist { char n ame[20]; char sex; struct date birthday; }pers on; 对结构体变量person的出生年份进行赋值时, (1级) A) year=1958 C) person. birthday . year=1958 4.以下对结构体类型变量的定义中不正确的是A) #define STUDENT struct student STUDENT { int num; float age; }std1; C) struct { int num; float age; }std1; 5.设有以下说明语句 struct stu { int a; float b; }stutype; 则下面的叙述不正确的是_____________ A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型 C)stutype是用户定义的结构体类型名 D)a和b都是结构体成员名 6.C语言结构体类型变量在程序执行期间 A)所有成员一直驻留在内存中 B)只有一个成员主留在内存中 C)部分成员驻留在内存中 D)没有成员驻留在内存中 下面正确的赋值语句是 _______________ B)birthday . year=1958 D) person. year=1958 ___________ 。(1 级) B)struct stude nt { int num; float age; }std1; D) struct { int num; float age; } stude nt; struct stude nt std1; (1级)

第10章 结构体和共用体-6向函数传递结构体

第10章结构体和共用体——向函数传递结构体

向函数传递结构体?向函数传递结构体的单个成员 复制单个成员的内容 ?向函数传递结构体的完整结构 复制结构体的所有成员 ?向函数传递结构体的首地址 仅复制一个地址值

Before:0,0,0 After:0,0,0 position ); printf("After:%d,%d,%d\n", position.x, position.y, position.z); typedef struct point { int x; int y; int z; }POINT; void Func(POINT p ) { p.x = 1; p.y = 1; 复制结构体的所有成员给函数 p.z = position.z;

&position ); printf("After:%d,%d,%d\n", position.x, position.y, position.z); Before:0,0,0 After:1,1,1 向函数传递结构体变量的地址 typedef struct point { int x; int y; int z; }POINT; void Func(POINT *pt { pt->x = 1;

结构体变量做函数返回值 position =Func(position); printf("After:%d,%d,%d\n", position.x, position.y, position.z); return 0; typedef struct point { int x; int y; int z; }POINT; POINT { return p; Before:0,0,0 After:1,1,1

结构体与共用体习题

第十一章 结构体与共用体 1、 填空 (1) 为了建立如图所示的存储结构(即每个结点含两个域,data 是数据域,next 是指向结点的指针域),请填空。 Struct link {char data; ; }node; (2) 以下程序的输出结果是 。 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);} 2、 选择 (1) 根据以下定义,能输出字母M 的语句是 A.printf(“%c\n ”,class[3].name); B.printf(“%c\n ”,class[3].name[1]); C.printf(“%c\n ”,class[2].name[1]); D.printf(“%c\n ”,class[2].name[0]); struct person { char name[9];int age;}; struct person class[10]={ “John ”,17, “Paul ”,19, “Mary ”,18, “Adam ”,16,}; (2) 对整个结构能够进行的操作是 。 A. 对结构进行赋值 data next

B.对结构进行存取 C.对结构进行运算 D.对结构进行&操作 (3)不是结构类型的特点的选项为。 A.结构体变量可以有不同类型的成员 B.结构体中的成员都占有存储空间 C.结构体变量既可以做函数参数,又可以从函数中返回 D.结构体变量的成员既可以读又可以写 3、判断 (1)能在一个存储区内处理不同的类型的数据叫结构。() (2)在编译时对结构类型不分配空间,只能对变量分配空间。() (3)结构一旦定义,系统就给它分配所需的内存单元。() 4、程序设计 (1)设有以下结构类型说明: struct stud {char num[5],name[10]; int s[4]; double ave; } 请编写: <1>readrec把30名学生的学号、姓名、四项成绩及平均分放在一个结构体数组中,学生的学号、姓名和四项成绩由键盘输入,然后计算出平均分放在结构提对应的域中。

C程第十一章结构体上机习题

第十一章结构体与共用体 问题与思考 1.下面程序的运行结果是___________. 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); } a)0 b)1 c)3 d)6 2.以下对结构体变量stu1中成员age的非法引用是____b____. struct student {int age; int num; }stu1,*p; p=&stu1; a) b) c)p->age d)(*p).age 3.以下scanf函数调用语句中对结构体变量成员的不正确引用是_____d___. struct pupil {char name[20]; int age; int sex; }pup[5],*p; p=pup; a)scanf("%s",pup[0].name); b)scanf("%d",&pup[0].age); c)scanf("%d",&(p->sex)); d)scanf("%d",p->age); 4.以下程序的运行结果是___10,x_____. struct n{ int x; char c; }; main() {struct n a={10,'x'}; func(a); printf("%d,%c",,;

} func(struct n b) { =20; ='y'; } 5.若有定义: struct num {int a; int b; float f; }n={1,3,}; struct num *pn=&n; 则表达式pn->b/*++pn->b的值是___12_____,表达式(*pn).a+pn->f的值是. 6.以下程序的运行结果是____7,3____. struct ks {int a; int *b; }s[4],*p; main() { int n=1; printf("\n"); for(i=0;i<4;i++) { s[i].a=n; s[i].b=&s[i].a; n=n+2; } p=&s[0]; p++; printf("%d,%d\n",(++p)->a,(p++)->a); } 7.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。请在_______内填入正确内容。 stati struct man{ char name[20]; int age; }person[]={"li=ming",18, "wang-hua",19, "zhang-ping",20

相关主题
文本预览
相关文档 最新文档