C语言程序设计 结构体与共用体
- 格式:doc
- 大小:50.00 KB
- 文档页数:10
11 结构体与共用体 (1)11.1 定义一个结构的一般形式 (1)11.2 结构类型变量的说明 (2)11.3 结构变量成员的表示方法 (4)11.4 结构变量的赋值 (4)11.5 结构变量的初始化 (5)11.6 结构数组的定义 (5)11.7 结构指针变量的说明和使用 (7)11.7.1 指向结构变量的指针 (7)11.7.2 指向结构数组的指针 (9)11.7.3 结构指针变量作函数参数 (10)11.8 动态存储分配 (11)11.9 链表的概念 (12)11.10 枚举类型 (14)11.10.1 枚举类型的定义和枚举变量的说明 (14)11.10.2 枚举类型变量的赋值和使用 (15)11.11 类型定义符typedef (16)11 结构体与共用体11.1 定义一个结构的一般形式在实际问题中,一组数据往往具有不同的数据类型。
例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。
显然不能用一个数组来存放这一组数据。
因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。
为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。
它相当于其它高级语言中的记录。
“结构”是一种构造类型,它是由若干“成员”组成的。
每一个成员可以是一个基本数据类型或者又是一个构造类型。
结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。
如同在说明和调用函数之前要先定义函数一样。
定义一个结构的一般形式为:struct 结构名{成员表列};成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。
对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。
例如:struct stu{int num;char name[20];char sex;float score;};在这个结构定义中,结构名为stu,该结构由4个成员组成。
C语言结构体与共同体C语言中结构体和共同体是两种用于组织和管理数据的重要概念。
它们可以帮助程序员更有效地管理和操作数据,提高程序的可读性和可维护性。
一、结构体(Structures)结构体是一种由不同类型的数据成员组成的数据类型,它允许程序员将不同类型的数据组织在一起并使用一个名称来引用它们。
结构体可以包含各种数据类型,例如整数、字符、数组或甚至其他结构体。
结构体的定义通过使用关键字struct来实现。
例如,下面的代码定义了一个名为Person的结构体,其中包含姓名、年龄和性别这三个成员:```cstruct Personchar name[50];int age;char gender[10];};```结构体定义可以在程序的任何地方,通常在函数外部定义,使得它在整个程序中都可见。
结构体的创建和初始化可以使用以下格式:```cstruct Person p1; // 创建名为p1的结构体变量struct Person p2 = {"John", 25, "Male"}; // 创建名为p2的结构体变量并初始化其成员```结构体成员可以通过`.`操作符来访问,例如:```cprintf("Name: %s\n", );```结构体可以作为函数的参数传递,也可以作为函数的返回值。
通过传递结构体作为参数,可以避免传递多个参数,提供了一种有效地传递多个相关数据的方法。
例如,下面的代码演示了一个函数,该函数接受一个名为p的Person结构体作为参数,并打印出其成员的值:```cvoid printPerson(struct Person p)printf("Name: %s\n", );printf("Age: %d\n", p.age);printf("Gender: %s\n", p.gender);```二、共同体(Unions)共同体是一种特殊类型的结构体,它允许不同类型的成员共享同一块内存空间。
页眉内容一、选择题1、定义结构类型时,下列叙述正确的是()A、系统会按成员大小分配每个空间B、系统会按最大成员大小分配空间C、系统不会分配空间D、以上说法均不正确2、已知结构类型变量x的初始化值为{“20”,30,40,35.5},请问合适的结构定义是()A、Struct s{int no;int x,y,z};B、Struct s{char no[2];int x,y,z};C、Struct s{int no;float x,y,z};D、Struct s{char no[2];float x,y,z};3、若程序中有定义struct abc{int x;char y;};abc s1,s2;则会发生的情况是()A、编译时会有错误B、链接时会有错误C、运行时会有错误D、程序没有错误4、已知学生记录描述为struct student{int no;char name[20];char set;struct{int year;int month;int day;}birth;};struct student s;设变量s中的“生日”应是“1984年11月11日”,下列对生日的正确赋值方式是( ).A)year=1984; B)birth.year=1984;month=11; birth.month=11;day=11; birth.day=11;C)s.year=1984; D)s.birth.year=1984;s.month=11; s.birth.month=11;s.day=11; s.birth.day=11;5、当说明一个结构体变量时系统分配给它的内存是( ).A)各成员所需内存量的总和 B)结构中第一个成员所需内存量C)成员中占内存量最大者所需的容量 D)结构中最后一个成员所需内存量6、以下对结构体类型变量的定义中不正确的是( ).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;}std1; }student;struct student std1; 7、设有以下说明语句struct stu{int a;float b;}stutype;则下面的叙述不正确的是( ).A)struct是结构体类型的关键字B)struct stu是用户定义的结构体类型C)stutype是用户定义的结构体类型名D)a和b都是结构体成员名8、C语言结构体类型变量在程序执行期间( )..A)所有成员一直驻留在内存中B)只有一个成员驻留在内存中C)部分成员驻留在内存中D)没有成员驻留在内存中9、在16位IBM-PC机上使用C语言,若有如下定义:struct data{int i;char ch;double f;}b;则结构变量b占用内存的字节数是( ).A)1 B)2 C)3 D)410、以下程序的运行结果是( ).#include “stdio.h”main(){struct data{int year,month,day;}today;printf(“%d\n”,sizeof(struct data));}A)6 B)8 C)10 D)1211、若有以下定义和语句;struct student{int age;int num ;};struct student stu [3]={{1001,20 },{1002,19},{1003,21}};main(){struct student *p;p=stu;…..}则以下不正确的引用是( )。
A)(P++)—》num B)p++ C)(*p).num D)p=&stu.age12、以下scanf函数调用语句中对结构体变量成员的不正确引用是( )。
stuct 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”“%d”,P->age);13、有以下定义和语句,则以下引用形式不合法的是( )。
Struct s{int i1;struct s*i2,i0;};static struct s a[3 ]={2,&a[1],’\0’,4,%a[2],&a[0],6,’\0’,&a[1]},*ptr;ptr=a;A) ptr->i1++ B)*ptr->i2 C)++ptr->i0 D) ptr->i114、设有如下定义:struct sk{int n;float x;}data,*p;若要使P指向data中的n域,正确的负值语句的是( )。
A、p=&data.n;B) *p=data.n;C)p=(struct sk*)&data.n;D)p=(struct sk*)data.n;15、若哟于以下说明和语句:struct student{int age;int num;}std,*p;p=&std;则以下对结构体变量std中成员age的引用方式不正确的是( )。
A)std.age B)p->age C)(*p).age D) *p.age16、若有以下说明和语句,则下面表达式中值为1002的是( )。
Struct student{int age;int num;};struct student stu[3]={{1001,20},{1002,19},{1003,21};struct student *p;p=stu;A)(p++)—>num B)(p++)—>age C)(*p).num D)(*++p).age17、以下对结构体变量stul 中成员age 的非法引用是()。
struct student{int age;int num;}stul,*p;p=&stul;A)stul.age B)student.age C)p—>age D)(*p).age18、若要利用下面的程序片段使指针变量p指向一个存储整型变量的存储单元,则[ ]中应填入的内容是()。
int *p;P=[ ]malloc(sizeof(int));A)int B)int* C)(*int) D)(int*)19、当说明一个共用体变量时系统分配给它的内存是()。
A)各成员所需内存量的总和 B)结构中第一个成员所需内存量C)成员中占内存量最大者所需的容量 D)结构中最后一个成员所需内存量20、以下对C语言中共用体类型数据的叙述正确的是()。
A)可以对共用体变量名直接赋值 B)一个共用体变量中可以同时存放其所有成员C)一个共用体变量中不可能同时存放其所有成员D)共用体类型定义中不能出现结构体类型的成员21、若有以下定义和语句:union data{int i;char c;float f;}a;int n;则以下语句正确的是()。
A)a=5; B)a={2,’a’,1.2}; C)printf(“%d\n”,a); D)n=a;22、设有以下说明,则下面不正确的叙述是()。
union data{ int i;char c;float f;}un;A)un所占的内存长度等于成员f的长度 B)un的地址和它的各成员地址都是同一地址C)un可以作为函数参数 D)不能对un赋值,但可以在定义un时对它初始化23、C语言共用体型变量在程序运行期间( ) 。
A)所有成员一直驻留在内存中 B)只有一个成员驻留在内存中C)部分成员驻留在内存中 D)没有成员驻留在内存中24、以下程序的运行结果是( ) 。
#include “stdio.h”main(){ union {long a;int b;char c;}m;printf(“%d\n”,sizeof(m));}A) 2 B)4 C)6 D)825、以下程序的运行结果是( ) .#include “stdio.h”union pw{int i;char ch[2];}a;main(){ch[0]=13;ch[1]=0;printf(“%d\n”,a,i); }A)13 B)14 C)208 D)209二、填空题1、以下程序的运行结果是【】. .struct n{int x;char c;};main(){struct n a={10,‘x’};func(a);printf(“%d,%c”,a.x,a.c);}func(struct n b){b.x=20;b.c=’y’;}2、以下程序的运行结果是【】.main(){struct EXAMPLE{struct{int x;int y;}in;int a;int b;}e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf(“%d,%d”,e.in.x,e.in.y);}3、以下程序用以输出结构体变量bt所占内存单元的字节数,请在【】内填上适当内容.struct ps{ double i;char arr[20];};main(){ struct ps bt;printf(“bt size : %d\n”,【】;}4、若已定义: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的值是【】5、以下程序的运行结果是【】。
struct ks{int a;int *b;} s[4],*p;main(){int n=1 , i;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);}6、以下程序运行结果为【】.struct s{int a;float b;char *c; }main(){static struct s x={19,83.5,”zhang”};struct s *px=&x;printf(“%d%.1f%s\n”,x.a,x.b,x.c);printf(“%d%.1f%s\n”,px―>a,(*px ).b, px―>c);printf(“%c%s\n”,*px―>c―1,&px―>c[1]); }7、设有以下定义和语句,请在printf语句的【】中填上能够正确输出的变量及相应的格式说明。