结构体与共用体习题 一、填空题 (1) 定义结构体的关键字是 ,定义共用体的关键字是 。 (2) 结构体和共用体的相同点是 ,不同点是 。 (3) 若有以下定义和语句,则sizeof(a)的值是__ ___,而sizeof(b)的值是__ _。 struct tu { int m; char n; int y;}a; struct { float p, char q; struct tu r} b; (4) 设有下面结构类型说明和变量定义,则变量a在内存所占字节数是 。如果将该结构改成共用体,结果为 。 struct stud { char num[6]; int s[4]; double ave; } a; (5) 下面程序用来输出结构体变量ex所占存储单元的字节数,请填空。 struct st { char name[20]; double score; }; main() { struct st ex ; printf(\ )); } (6) 下面定义的结构体类型拟包含两个成员,其中成员变量info用来存入整形数据;成员变量link是指向自身结构体的指针,请将定义补充完整。 struct node { int info; link; } (7) 以下程序执行后输出结果是 。 main() { union { unsigned int n; unsigned char c; } u1; u1.c='A'; printf(\ } (8) 变量root如图所示的存储结构,其中sp是指向字符串的指针域,next是指向该结构的指针域,data用以存放整型数。请填空,完成此结构的类型说明和变量root的定义。 root sp next data struct list { char *sp ; __ __; _ _; } root; 2. 阅读下面的程序,写出程序结果 (1) struct info { char a,b,c;};
答 案 (1) struct,union (2) 由多个成员组合而成的自定义数据类型,结构体的大小是各成员大小之和,而联合体的大小是最大成员的大小。 (3) 12,20 (4) 32,16 (5) ex (6) struct node* (7) A (8) struct list* next,int data 2. (1) 2 (2) ,0 (3) 0 3. (1) struct com { int a; int b;}; void main() { struct com x,y,sum; x.a=1;x.b=2; y.a=4;y.b=3; sum.a=x.a+y.a; sum.b=x.b+y.b; } (2) #include \struct data { int y; int m; int d; }; int f(struct data day) { int n[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i; if(day.m<2) n[0]=day.d; else { 36
main() { struct info s[2]={{‘a’,‘b’,‘c’},{‘d’,‘e’,‘f’}};int t; t=(s[0].b-s[1].a)+(s[1].c-s[0].b); printf(\ } (2) void main() { union { char i[2]; int k; } stu; stu.i[0]='2'; stu.k=0; printf(\ } (3) union myun { struct{ int x, y, z; } u; int k; } a; main() { a.u.x=4; a.u.y=5; a.u.z=6; a.k=0; printf(“%d\\n\ 3. 程序设计题 (1)设计一个程序,用结构类型实现两个复数相加。 (2)定义一个结构类型变量(包括年、月、日)实现:输入一个日期显示它是该年第几天。 for(i=1;i 37