第10章 结构体与共用体 概述 结构体 共用体 枚举类型
“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。 结构简介 问题: 存储一个班级中 5 名学员的信息(学号、姓名、性别和成绩) 解决方案: I. 使用数组 II. 使用多维数组 不能建立数组间的关系 01 02 03 04 05 num III. 使用结构 C 语言不允许一个数组包含多种数据类型 Mary John Peter Rose Kate F M 01 02 03 04 05 89 78.5 67 97.5 64 C 语言引入了称为结构的数据存储方式 Mary John Peter Rose Kate name num name sex score F M sex score 89 78.5 67 97.5 64 “结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。
§10.1 概述 结构体(structure)是用户自定义的一种数据类型,包含若干个类型不同的数据项。 §10.1 概述 结构体(structure)是用户自定义的一种数据类型,包含若干个类型不同的数据项。 用途:把不同类型的数据组合成一个整体。而分别用独立变量来表示不能反映它们之间的内在联系。 例:定义一个结构体类型student,包含学号、姓名、性别、年龄、成绩、家庭地址。
§10.1 概述 结构体类型的定义 struct 结构体名 { 类型标识符 成员名1; 类型标识符 成员名2; …… }; 合法标识符 可省略:无名结构体 结构体类型的定义 struct 结构体名 { 类型标识符 成员名1; 类型标识符 成员名2; …… }; struct是关键字,不能省略 成员类型可以是基本类型或构造类型 必须有分号
定义结构 struct structurename { datatype variable1; datatype variable2; 结构名 struct structurename { datatype variable1; datatype variable2; ... }; 结构成员 C 语言中的有效数据类型 struct student { int num; char name[20]; char sex; float score; };
定义结构 struct student { int num; char name[20]; char sex; float score; }; student num name sex score 结构定义并不预留内存 结构定义放置在程序的开始部分,位于头文件声明之后 结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。
可以改写成int year,mongth,day; 日期结构体类型:由年、月、日三项组成 struct date { int year; int month; int day; }; 可以改写成int year,mongth,day; struct std_info { int num ; char name[20]; char sex; float score; char addr[30]; struct date birthday; }; 学生信息结构类型:由学号、姓名、性别、成绩、地址和生日共6项组成
§10.1.1结构体变量的定义 间接定义法: 直接定义法: 先定义结构体类型,后定义结构体变量 在定义结构类型的同时,定义结构变量 结构体类型名student可以不写 struct student { int num ; char name[20]; char sex; int age; float score; char addr[30]; }; struct student stu1,stu2; struct student { int num ; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
num name sex age score addr struct student { int num ; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2; num name sex age score addr stu1: 2 20 1 2 4 30 stu1在内存中共占字节数: 2+20+1+2+4+30=59
§10.1.3 结构体变量的引用 结构体变量的引用原则 结构体变量不能整体输入输出,要通过成员运算符“.”,逐个访问其成员,且访问的格式为: 结构体变量.成员 “.”是成员运算符,优先级最高 struct date { int year; int month; int day; }; struct date birth; printf("%d,%d,%d",birth); printf("%d,%d,%d",birth.year, birth.month,birth.day);
结构体变量的引用原则 如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。 struct date { int year; int month; int day; }; 如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。 结构变量.成员.子成员.….最低级子成员 struct std_info { int num ; char name[20]; char sex; float score; struct date birthday; }student; 引用结构变量student中的birthday成员的格式分别为: student.birthday.year student.birthday.month student.birthday.day num name sex score birthday 对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。 student:
结构体变量的初始化 结构体类型名 结构体变量={初值表}; 一般形式 说明 结构体类型名 结构体变量={初值表}; 说明 若某成员本身又是结构体类型,则该成员的初值为一个初值表 初值的数据类型,应与结构变量中相应成员的类型一致 struct std_info { int num ; char name[20]; char sex; float score; struct date birthday; }; struct std_info student={102, "Zhangsan", 'M', 85, {1980,9,20}} ;
结构变量初始化 student1 struct student { int num; char name[20]; char sex; float score; }; struct student student1,student2; 结构变量初始化 赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。 struct student student1={1,"Yao Ming ",'M',90.5}; 内存 student1 1 Yao Ming M 90.5 student1.name student1.num student1.score student1.sex
结构变量赋值 用输入语句或赋值语句来给结构变量的各个成员赋值 78 student3 = student2; student2 1 student2.num=1; student2.name="Zhang Zi Liang"; student2.sex=’M’; printf("请输入成绩:\n"); scanf("%f",&student2.score); 78 student3 = student2; student2 1 Zhang Zi Liang M 78 student3 1 Zhang Zi Liang M 78
使用结构示例 stu1 李亚鹏 1 M 78 stu2 周晶晶 2 F 92 问题描述: 根据学员的成绩,输出不及格学员的详细信息。 #include<stdio.h> struct student { int num;//学号 char *name;//姓名 char sex;//性别 float score;//成绩 }; void main() static struct student stu1={1,"李亚鹏",'M',61}; static struct student stu2={2,"周晶晶",'F',92.5}; static struct student stu3={3,"姚光明",'M',59}; printf("不及格学员的名单如下:\n"); if(stu1.score<60) printf("%d\t%s\t%c\t%5.2f\n",stu1.num,stu1.name,stu1.sex,stu1.score); if(stu2.score<60) printf("%d\t%s\t%c\t%5.2f\n",stu2.num,stu2.name,stu2.sex,stu2.score); if(stu3.score<60) printf("%d\t%s\t%c\t%5.2f\n",stu3.num,stu3.name,stu3.sex,stu3.score); if(stu1.score>=60 && stu2.score>=60 && stu3.score>=60) printf("没有不及格的学员。\n"); } 使用结构示例 stu1 李亚鹏 1 M 78 stu2 周晶晶 2 F 92 问题描述: 根据学员的成绩,输出不及格学员的详细信息。 stu3 姚光明 3 M 59 不及格学员的名单如下: 3 姚光明 M 59.00
[例] 定义一个结构变量stu,用于存储和显示一个学生的基本 情况。 struct std_info {int num ; char name[20]; char sex; struct date birthday; }; main() { struct std_info stu={102, "Zhangsan", 'M', {1980,9,20}} ; printf("Num: %d\n",stu.num); printf("Name: %s\n",stu.name); printf("Sex: %c\n",stu.sex); printf("Birthday: %d-%d-%d\n",stu.birthday.year, stu.birthday.month, stu.birthday.day); } struct std_info stu; scanf("%d%s %c%d%d%d", &stu.num,stu.name,&stu.sex,&stu.birthday.year,&stu.birthday.month,&stu.birthday.day);
§10.2结构体数组 定义:结构数组的每一个元素,都是结构类型数据,均包含结构类型的所有成员。 struct student {int num ; char name[20]; char sex; int age; float score; }; struct student stu[3] ; stu[0] stu[1] stu[2] 101 Lilin M 18 87.5 102 Zhanghua 99 103 Wuli F 19 78.5
结构体数组初始化: 结构体类型名 结构体数组名[n]={{初值表1},{初值表2}, ...,{初值表n}}; struct student {int num ; char name[20]; char sex; int age; float score; }; struct student stu[3]={{101,"Lilin",'M',18,87.5}, {102,"Zhanghua",'M',18,99},{103,'Wuli",'F',19,78.5}} ;
[例]定义结构类型struct std_info,定义一个结构数组stu,用于存储和显示三个学生的基本情况。 struct date {int year; int month; int day; }; struct std_info {int num ; char name[20]; char sex; struct date birthday; } stu[3]={{102,"Zhangsan",'M',{1980,9,20}}, {105,"Lisi",'M',{1980,8,15}}, {112,"Wangwu",'F',{1980,3,10}} }; main() { int i; printf("No. Name Sex Birthday\n"); for(i=0; i<3; i++) { printf("%-7d",stu[i].num); printf("%-9s",stu[i].name); printf("%-4c",stu[i].sex); printf("%d-%d-%d\n",stu[i].birthday.year, stu[i].birthday.month,stu[i].birthday.day); } } 程序运行结果: No. Name Sex Birthday 102 Zhangsan M 1980-9-20 105 Lisi M 1980-8-15 112 Wangwu F 1980-3-10
}leader[3]={“Lian”,0,“ABian”,0,”Song“,0}; main() <例> 统计后选人选票 struct person { char name[20]; int count; }leader[3]={“Lian”,0,“ABian”,0,”Song“,0}; main() { int i,j; char leader_name[20]; for(i=1;i<=10;i++) { scanf("%s",leader_name); for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++; } for(i=0;i<3;i++) printf("%5s:%d\n",leader[i].name,leader[i].count); name count Lian ABian Song
§10.3 指向结构体类型数据的指针 指向结构体变量的指针 结构体变量在内存中的起始地址称为结构体变量的指针。 main() struct student { int num ; char name[20]; char sex; int age; float score; }; main() {struct student stu; struct student *p=&stu; p->num=101; strcpy(p->name,"lilin");} struct student { int num ; char name[20]; char sex; int age; float score; }; main() {struct student stu; struct student *p=&stu; (*p).num=101; strcpy((*p).name,"lilin");}
引用结构体变量成员的三种形式: 结构体成员运算符"."和"->"的比较: 结构体变量.成员名 stu.num 若struct student stu; struct student *p=&stu;则 结构体变量.成员名 stu.num (*p).成员名 (*p).num p->成员名 p->num 结构体成员运算符"."和"->"的比较: 二者的优先级相同,自左向右结合 运算符"."前面只能是结构体变量名或(*p) 运算符"->"前面只能是指向结构体的指针变量名,不能是其它变量名 stu->num 设有以下语句: struct st{int n;struct st *next;}; static struct st a[3]={5,&a[1],7,&a[2],9,'\0'},*p; p=&a[0]; 则表达式( )的值是6。 A.p++->n B.p->n++ C.(*p).n++ D.++p->n 分析下列表达式: p->num p->num++ ++p->num D
指向结构体数组的指针 说明: 如果指针变量p指向结构体数组,则p+1指向结构体数组的下一个元素,而不是当前元素的下一个成员。 p=stu; p=stu.name; (++p)->num (p++)->num struct student {int num ; char name[20]; char sex; int age; }; struct student stu[3]={{101,"Lilin",'M',18,}, {102,"Zhanghua",'M',18}, {103,'Wuli",'F',19,}} ; struct student *p=stu; main() {for( ; p<stu+3; p++) printf("%d,%s,%c",p->num,p->name,p->sex); } num name sex age stu[0] p stu[1] stu[2] p+1
x y aa dt p 50 60 70 80 &dt[0] &dt[1] &dt[2] &dat[3] 10 20 30 40 p++ <练>下面程序的输出结果为( )。 struct st { int x; int *y; } *p; int dt[4]={10,20,30,40}; struct st aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3]}; main() { p=aa; printf("%d\n",++p->x); printf("%d\n",(++p)->x); printf("%d\n",++(*p->y)); } A.10 B.50 C. 51 D.60 20 60 60 70 20 21 21 31
用结构体变量和指向结构体的指针作函数参数 用结构体类型数据作为函数参数有以下三种形式: 用结构体变量的成员作参数 用法与普通变量作参数相同,值传递 用结构体变量作参数 函数的实参和形参必须都是结构体变量,程序效率低,不主张用 用指向结构体变量的指针作参数 提高运行效率
§10.4 用指针处理链表 一、链表结构 链表的三要素: 头指针变量head-指向链表的首结点(链表中每一个元素称为一个结点) §10.4 用指针处理链表 一、链表结构 Head 1249 A 1356 B 1475 C 1021 D NULL 链表的三要素: 头指针变量head-指向链表的首结点(链表中每一个元素称为一个结点) 每个结点由2个域组成: 数据域-----存储结点本身的信息 指针域-----存储后继结点的指针(地址) 尾结点的指针域为NULL(空),作为链表结束的标志
§10.5 共用体 概念: 共用体类型的定义 ----与结构体类型的定义类似 使几个不同的变量占有同一段内存空间的结构称为共用体 union 共用体类型名 { 类型标识符 成员名1; 类型标识符 成员名2; …… }; union category { int class; char position[10]; }
共用体变量的定义----与结构体变量的定义类似 间接定义法: 先定义共用体类型,后定义共用体变量 直接定义法: 在定义共用体类型的同时,定义共用体变量 union data {int i; char ch; float f; }; union data un1,un2,un3; union data {int i; char ch; float f; }un1,un2,un3;
2000 2001 2002 2003 un1: ch i f union data {int i; char ch; float f; 注意:共用变量占用的内存空间,等于最长成员的长度,而不是各成员长度之和。 union data {int i; char ch; float f; }; union data un1,un2,un3; 2000 2001 2002 2003 un1: ch i f un1占用的内存空间为4字节(不是2+1+4=7字节)。
共用体变量的引用 特点 与结构体变量的引用一样,也只能逐个引用共用体变量的成员 un1=1; m=a;un1.i=1;m=un1.i; (1)系统采用覆盖技术,实现共用变量各成员的内存共享,所以在某一时刻,最后一次存入的成员值是起作用的。 例如,执行un1.i=1; un1.ch='c'; un1.f=3.14后,un1.f才是有效的成员。 (2)由于所有成员共享同一内存空间,故共用变量与其各成员的地址相同。 例如,&un1==&un1.i==&un1.ch==&un1.f。 (3)不能对共用体变量进行初始化(注意:结构体变量可以);也不能将共用变量作为函数参数,以及使函数返回一个共用体数据,但可以使用指向共用变量的指针。 (4)共用类型可以出现在结构类型定义中,反之亦然。
结构体与共用体 区别: 存储方式不同 联系: 两者可相互嵌套 struct node { char ch[2]; ch int k; a union node }b; a ch k b 变量的各成员同时存在 任一时刻只有一个成员存在
struct date { int day; int month; int year; union { int share1; 下面定义中sizeof(a)和sizeof(a.share)的值是? struct date { int day; int month; int year; union { int share1; float share2; }share; } a; 例 sizeof(a)=10 sizeof(a.share)=4
下面定义中变量w在内存中所占字节数? union aa { float x,y; char c[6]; }; struct st { union aa v; float w[5]; double ave; } w; 例 sizeof(w)=34
下列程序输出结果是( )。 例 #include <stdio.h> main() {union {int k; 下列程序输出结果是( )。 #include <stdio.h> main() {union {int k; char i[2]; }*s,a; s=&a; s->i[0]=0x39; s->i[1]=0x38; printf("%x\n",s->k); } A.3839 B.3938 C.380039 D.390038 共用体变量a 0011 1001 a.i[0] a.k 或s->i[0] 或s->k a.i[1] 在内存中存储 形式为 或s->i[1]
下列程序输出结果是( )。 例 #include <stdio.h> main() {union {int k; 下列程序输出结果是( )。 #include <stdio.h> main() {union {int k; char i[2]; }*s,a; s=&a; s->i[0]=0x39; s->i[1]=0x38; printf("%x\n",s->k); } A.3839 B.3938 C.380039 D.390038 共用体变量a 0011 1001 s->i[0] s->k 0011 1000 s->i[1] 在内存中存储 形式为
下列程序输出结果是( )。 例 #include <stdio.h> main() {union {int k; 下列程序输出结果是( )。 #include <stdio.h> main() {union {int k; char i[2]; }*s,a; s=&a; s->i[0]=0x39; s->i[1]=0x38; printf("%x\n",s->k); } A.3839 B.3938 C.380039 D.390038 共用体变量a 低字节 0011 1001 s->i[0] s->k 高字节 0011 1000 s->i[1] 故s->k在 内存中存储数据为: 0011 1000 0011 1001
若有以下的说明、定义和语句,则输出结果为___。 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a w.c[1]
若有以下的说明、定义和语句,则输出结果为___。 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1]
若有以下的说明、定义和语句,则输出结果为___。 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001
以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 1
以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 1
以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 5 1
以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 5 1
以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 例 若有以下的说明、定义和语句,则输出结果为___。 main() { union un { int a; char c[2]; } w; w.c[0]='A';w.c[1]='a'; printf("%o\n",w.a); } 共用体变量w 0100 0001 w.c[0] w.a 0110 0001 w.c[1] 故w.a在 内存中存储数据为: 0110 0001 0100 0001 以八进制形式输出,二进制向八进制转换原则是:三位二进制对应一位八进制 6 5 1 运行结果: 60501
以下程序运行的输出结果是( )。 main() {union {char i[2]; int k; }r; r.i[0]=2;r.i[1]=0; printf("%d\n",r.k); } A.2 B.1 C.0 D.不确定 A
例 共用体变量e e.in.x e.a 或e.b e.in 程序运行的结果是________。 main() { union 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\n",e.in.x,e.in.y); } e.in.y
例 共用体变量e e.in.x e.a 或e.b 1 e.in 程序运行的结果是________。 main() { union 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\n",e.in.x,e.in.y); } e.in.y
例 共用体变量e e.in.x e.a 或e.b 2 1 e.in 程序运行的结果是________。 main() { union 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\n",e.in.x,e.in.y); } e.in.y
例 共用体变量e e.in.x e.a 或e.b 4 2 e.in 程序运行的结果是________。 main() { union 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\n",e.in.x,e.in.y); } e.in.y
§10.6 枚举类型 用途: 枚举类型的定义 enum 枚举类型名{取值表}; 枚举变量的定义----与结构体变量定义类似 如果一个变量只有几种可能的值,就可以定义成枚举类型 枚举类型的定义 enum 枚举类型名{取值表}; 例:enum weekdays {Sun,Mon,Tue,Wed,Thu,Fri,Sat}; 枚举变量的定义----与结构体变量定义类似 间接定义:enum weekdays work; 直接定义:enum weekdays {Sun,Mon,Tue,Wed,Thu,Fri,Sat } work;
说明: (1)枚举型仅适应于取值有限的数据。 例:1周7天,1年12个月。 (2)取值表中的值称为枚举元素,其含义由程序解释。 例:不是因为写成“Sun”就自动代表“星期天”。事实上, 枚举元素用什么表示都可以。 (3)枚举元素按常量处理,它们的值是定义时的顺序号(从0开始),所以枚举元素可以进行比较,比较规则是:序号大者为大! 例:上例中的Sun的值为0、Mon的值为1、……、Sat的值为6,所以Mon>Sun,Sat最大。 (4)枚举元素的值也是可以人为改变的:在定义时由程序指定。 例:如果enum weekdays {Sun=7, Mon=1 ,Tue, Wed, Thu, Fri, Sat};则Sun=7,Mon=1,从Tue=2开始,依次增1。 注意:不同的枚举元素不可以指定相同的值 (5)一个整数不能直接赋值给枚举变量 例:workday=2;(非法,因为类型不同) 改写成:workday=(enum weekday)2;
char *aa[]={"AA","BB","CC","DD"}; 下面程序的输出是( )。 main() { enum team{my,your=4,his,her=his+10}; printf("%d %d %d %d\n",my,your,his,her); } A.0 1 2 3 B.0 4 0 10 C.0 4 5 15 D.1 4 5 15 C 下面程序的输出是 。 main() { enum em{em1=3,em2=1,em3}; char *aa[]={"AA","BB","CC","DD"}; printf("%s%s%s\n",aa[em1],aa[em2],aa[em3]); } DDBBCC
§10.10 用typedef定义类型 关键字 作用:用typedef定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。 定义已有类型别名的方法 (1)按定义变量的方法,写出定义体; (2)将变量名换成别名; (3)在定义体最前面加上typedef。 例:给结构类型struct date定义1个别名DATE。 struct date { int year, month, day; }; (1)按定义结构变量的方法,写出定义体:struct date {……} d; (2)将变量名换成别名: struct date {……} DATE; (3)在定义体最前面加上typedef: typedef struct date {……} DATE; 例:给实型float定义1个别名REAL。 (1)按定义实型变量的方法,写出定义体: float f; (2)将变量名换成别名: float REAL; (3)在定义体最前面加上typedef: typedef float REAL; typedef int *ipoin; ipoin p;
说明 (1)用typedef只是给已有类型增加1个别名,并不能创造1个新的类型。 (2)typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,而且只能作简单的字符串替换。
3.若要说明一个类型名STP,使得定义语句STP s;等价于char *s;,以下选项中正确的是 2 .下面程序的输出是( )。 typedef union { long x[2]; int y[4]; char z[8]; } MYTYPE; MYTYPE them; main() { printf("%d\n",sizeof(them)); } A.32 B.16 C.8 D.24 1.设有以下定义 typedef union { long i; int k[5]; char c; } DATE; struct date { int cat; DATE cow; double dog; } too; DATE max; 则语句printf(〞%d〞,sizeof(struct date)+sizeof(max)))的执行结果是( )。 A.25 B.30 C.18 D.8 C 4.设有以下说明语句 typedef struct { int n; char ch[8]; }PER; 则下面叙述中正确的是 A) PER 是结构体变量名 B) PER是结构体类型名 C) typedef struct 是结构体类型 D) struct 是结构体类型名 3.若要说明一个类型名STP,使得定义语句STP s;等价于char *s;,以下选项中正确的是 A) typedef STP char *s; B) typedef *char STP; C) typedef STP *char; D) typedef char* STP ; B D B
D) 程序中可用INTEGER代替int类型名 若有以下说明和定义 typedef int *INTEGER INTEGER p,*q; 以下叙述正确的是______。 A) p是int型变量 B) p是基类型为int的指针变量 C) q是基类型为int的指针变量 D) 程序中可用INTEGER代替int类型名 B