结构体和共用体
结构体与共用体
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
结构体与共用体
4、共用体类型的变量如何赋初值,含义是什么?
不能对共用体变量名赋值,也不能在定义共用体变量时初始化。但可以用一个共用体变量为 另一个变量赋值
例:union
{ int i;
char ch;
double f;
}a={1,’a’,1.5}; ()
a=1;
()
m=a;
()
例:float x; union { int i; char ch; double f; }a,b; a.i=1; a.ch=‘a’; a.f=1.5; b=a; () x=a.f; ()
二. 枚举类型的应用
• 1.枚举类型变量的定义 ◆先定义枚举类型,再定义枚举类型变量
enum week{sun,mon,tue,wed,thu,fri,
sat};
enum week weekday,workday; ◆定义枚举类型的同时定义枚举变量 enum color {red,blue,green,black}a,b,c;
共用体类型的关键字
union 联合类型名 { 数据类型 成员名1 数据类型 成员名2
...........
数据类型 成员名n };
例:
union utype {
char ch; int i; float f; };
2、如何定义共用体类型的变量
(1)先定义类型,再定义变量,例如: union data /*共用体类型定义*/ { int i;
◆直接定义枚举变量 enum {male,female}sex1,sex2;
枚举类型变量的特点
例 enum DAY {
MON=1, TUE, WED, THU, FRI, SAT, SUN };
(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
结构体与共用体zlh
结构体中每个成员可以是不同的 数据类型,而共用体中所有成员 必须是相同的数据类型。
结构体与共用体的区别与联系
• 使用方式:结构体中每个成员都可以单独访问和操作,而 共用体中一次只能使用其中一个成员。
结构体与共用体的区别与联系
自定义类型
结构体和共用体都是用户自定义的数据类型 ,可以根据需要组合不同的数据类型。
对于大型结构体和共用体,可以使用指针成 员来减少直接内存占用。
在跨平台编程时,要注意不同平台下的内存 对齐规则可能不同,需要进行相应的调整。
05
结构体与共用体的应用案例
案例一:使用结构体实现学生信息管理
定义学生结构体
包含学生姓名、学号、性别、年龄等字段。
创建学生信息数组
根据学生数量,创建相应大小的学生信息数组。
访问速度较慢
访问结构体的成员变量时,需要通过 指针或引用等方式进行间接访问,相 对于直接访问基本数据类型,速度较 慢。
结构体与共用体的优缺点分析
内存占用小
共用体中的所有成员变量共享同一块内存空间,因此相对于 结构体,共用体的内存占用较小。
访问速度快
访问共用体的成员变量时,可以直接通过内存地址进行访问 ,速度较快。
封装性好
结构体可以将多个变量封装在一起,形成一个自定义的数据类型,方便数据的 处理和管理。
结构体与共用体的优缺点分析
• 可扩展性强:结构体可以方便地添加或删除成员 变量,以适应不同的应用场景和需求。
结构体与共用体的优缺点分析
内存占用较大
由于结构体中每个成员变量都占用独 立的内存空间,因此相对于基本数据 类型,结构体的内存占用较大。
赋值给共用体变量
可以给共用体的任何一个成员赋值,如`data.f = 3.14;`,表示将 `data`的`f`成员赋值为3.14。
结构体和共用体
num
name
birthday
month
day
year
stu1.birthday.month=12;
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
直接定义结构体变量 一般形式:
{ 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列;
struct
{ int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
形式二:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }结构体变量={初始数据};
例 struct student { int num; char name[20]; char sex; int age; char addr[30]; }stu1={112, "Wang Lin", 'M',19, "200 Beijing Road"};
成员类型可以是 基本型或构造型
struct是关键字, 不能省略
合法标识符 可省:无名结构体
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; };
顺序初始化: struct student { int num; char name[20]; char sex; int age; }; struct student stu[ ]={100, "Wang Lin", 'M',20, 101, "Li Gang", 'M',19, 110, "Liu Yan", 'F',19};
C语言第11讲--结构体和共用体
如:方式(2) 方式 struct student int score[4];}
{long num;char name[20];
结构体数组初始化
a[3]={{20030001,"zhang",89,90,91,92}, {20030002,"liu",68,69,70,71}, {20030003,"li",57,58,59,60} };
第十三讲 特殊数据类型
—— 结构体、共用体、 结构体、共用体、 枚举类型、 枚举类型、自定义类型
§11.1 结构体和共用体概述
数组可以存放一组相关的同类型数据, 数组可以存放一组相关的同类型数据,但是 一组相关的同类型数据 不能将不同类型的数据放入同一数组中。 不能将不同类型的数据放入同一数组中。 如果需要把一个学生的学号、姓名、性别、 如果需要把一个学生的学号、姓名、性别、 年龄、各门功课的考试成绩等不同类型的数 年龄、各门功课的考试成绩等不同类型的数 放在一个构造型数据类型中, 据放在一个构造型数据类型中,就需要另外 一种新的数据类型: 一种新的数据类型:结构体类型或者共用体 类型数据 数据。 类型数据。 一个结构体类型的变量中可以独立存放多种 类型的数据,一个共用体 共用体类型的变量中可以 类型的数据,一个共用体类型的变量中可以 共用同一段存储单元来存放不同类型的数据 来存放不同类型的数据。 共用同一段存储单元来存放不同类型的数据。
4
三、对结构体类型的说明
结构体类型与结构体类型变量是两个概念, 结构体类型与结构体类型变量是两个概念, 应区分结构体名与变量名。 应区分结构体名与变量名。 成员也可以是一个结构体变量。 成员也可以是一个结构体变量。
第九章 结构体和共用体
• (3)结构体数组的初始化 – 结构体数组定义好之后就可以对结构体数组进行赋 值操作,包括在定义结构体数组时赋值和在定义结 构体数组之后赋值。 • 【例9.4】输入输出学生相关信息,学生信息包括学号 (num)、姓名(name)、语文成绩(chinese)、英语成 绩(english)、数学成绩(maths)。
• ⑥不同结构体类型的成员名可以相同,结构体的成员名也可以与基 本类型的变量名相同。他们分别代表不同的对象,系统将以不同的 形式表示它们。如: 1. struct student 2. { int num; 3. char name[20]; 4. int age; 5. int score; 6. } a,b; 7. struct teacher 8. { int num; 9. char name[20]; 10. int age; 11. float salary; 12. }c,d; • ⑦“struct 结构体类型名”为结构体的类型说明符,可用于定义或说 明变量。结构体类型的定义可置于函数内,这样该类型名的作用域 仅为该函数。如果结构体类型的定义位于函数之外,则其定义为全 局的,可在整个程序中使用。
21
• 为指示相邻结点关系,可在第一个结点的指 针域内存入第二个结点的首地址,在第二个 结点的指针域内又存放第三个结点的首地址, 如此串联下去直到最后一个结点。最后一个 结点因无后续结点连接,其指针域可赋为0。 这样一种连接方式,在数据结构中称为“链 表”。图9-3为一简单链表的示意图。
22
9.3.2处理动态链表所需的函数
• (*结构体指针变量).成员名 • 或者 • 结构体指针变量->成员名
– 【例9.5】用指向结构体变量的指针变量引用结构体变量
14
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.定义结构体类型变量说明结构变量有以下三种方法。
第11章结构体与共用体共39页PPT资料
13.05.2020
10
#include<stdio.h>
#include<string.h>
struct person
{char name[20];
int count;
}leader[3]={"Li",0,"Zhang",0,"Fun",0}; void main()
{int i,j;
char leader_name[20];
➢在定义时初始化(eg11.1)
struct student { int num; char name[20]; char sex;
a.num=89031; a.sex=‘M’; name如何赋初值?
char addr[20];
}aa=;{89031,"Li Lin",'M',"123 Beijing Road"};
‘M’ 59B
18
87.5
stu[0]
“123 Beijing”
10102
“zhang fun” ‘M’ 19 99
“123 shanghai”
stu[1]
3)结构体数组的应用举例 例 11.2 对候选人得票的统计程 序。有3个候选人,每次输入一个 得票的候选人的名字,要求最后输 出各人的得票结果。
结构体类型
char sex;
short int age;
13.05.2020
float score;
struct student stu;
char addr[30];
};
1
➢ 结构体类型的形式:
struct 结构体名
C语言程序设计——结构体和共用体(完整版)
printf(“name\tage\tjob\tclass/office\n”); for(i=0;i<PN;i++) {if(body[i].job==„s‟) printf(“%s\t%d\t%3c\t%d\n”,body[i].name, body[i].age,body[i].job,body[i].units.class); else printf(“%s\t%d\t%3c\t%s\n”,body[i].name, body[i].age,body[i].job,body[i].units.office); } }
birthday num name sex age month day year addr
§12.3结构体数组
结构体数组的每一个元素都是具有相同结构类型 的结构体变量。 例:struct student {int num; char name[20]; float score; }stu[3]; 其中,定义了一个结构体数组stu,共有3个元素, 每个元素都具有struct student的结构形式。
§12.6共用体
共用体(也称为联合)也是一种构造的数据类型。 共用体是将不同类型的数据组织在一起共同占用 同一段内存的一种构造数据类型。 例如,在校学生和教师都填写以下表格: 姓名 年龄 职业 单位 其中,职业分两类:教师和学生; 而单位一栏里,学生填写班级编号(整型类型), 教师填写某系某教研室(整型类型) 。
§12.7枚举数据类型
当某些变量仅由有限个数据值组成时,通常用枚 举类型来表示。 所谓枚举是指将变量的值一一列举出来,变量的 值只限于列举出来的值的范围内。如一周只有7天, 一年只有12个月等等。
注意:枚举类型是一种基本数据类型,而不是一 种构造类型。关键字为enum。
结构体与共用体
10.1 结构体类型和结构体变量
如:
struct date
/*声明一个结构体类型*/
{ int month;
int day;
int year;
};
struct student
{int num;
char name[20];
char sex;
int age;
struct date birthday;/*birthday是struct date类 型*/
10.1.1 结构体型的定义
如前所述,结构体是由不同数据类型的数据组成的。组成结 构体的每一个数据称为该结构体的成员。在程序中使用结构 体时,首先要对结构体的组成进行描述,这称为结构体型的 定义,结构体型的定义是确定该结构体型由哪几个成员项组 成,以及每个成员项具有什么数据类型。
下一页 返回
10.1 结构体类型和结构体变量
10.1 结构体类型和结构体变量
注意不要忽略最后的分号。struct student向编译系统声 明这是一个“结构体类型”,它包括num、name、sex、 age、score和addr等不同类型的数据项。应当说明 struct student是一个类型名,它和系统提供的标准类型 (如int、char、float和double等)一样具有同样的地位 和作用,都可以用来定义变量的类型,只不过结构体类型需 要由用户自己指定而已。
上一页 下一页 返回
10.1 结构体类型和结构体变量
例10-1 定义如下结构体型。 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; };
结构体与共用体小结
结构体与共用体小结结构体和共用体是C语言中非常重要的数据类型。
它们在存储和组织数据方面提供了更灵活的选择。
本文将从定义、声明、初始化、使用和比较等方面对结构体和共用体进行详细讨论。
一、结构体(Struct)结构体是一种能够存储不同类型数据的自定义数据类型。
它允许将不同类型的数据组合在一起,形成一个逻辑上的实体。
1.定义和声明结构体的定义使用关键字`struct`,可以像定义其他变量一样定义结构体。
例如:```cstruct Studentint id;char name[20];int age;};```在定义结构体后,可以使用该结构体类型声明变量。
例如:```cstruct Student stu1;```也可以一步完成结构体类型定义和变量声明。
例如:```cstruct Studentint id;char name[20];int age;} stu1;```2.初始化结构体变量可以使用初始化列表初始化。
例如:```cstruct Student stu1 = {1001, "John", 20};```3.使用结构体变量的成员可以通过`.`运算符访问。
例如:```cstu1.id = 1001;strcpy(, "John");stu1.age = 20;```4.比较结构体不能直接比较,但可以通过定义比较函数来比较。
例如:```creturn (stu1.id == stu2.id && strcmp(, ) == 0 && stu1.age == stu2.age);```二、共用体(Union)共用体是一种特殊的数据类型,它允许不同类型的成员共享同一块内存空间。
共用体的成员在内存中是相互重叠的,只有一个成员可以被赋值和使用。
1.定义和声明共用体的定义使用关键字`union`,可以像定义其他变量一样定义共用体。
例如:```cunion Dataint i;float f;char str[20];};```在定义共用体后,可以使用该共用体类型声明变量。
共用体和结构体的区别
其中,struct 是结构体关键字,一定不能省略。 node 是结构体名,可以省略,成为无名结构体。 结构体成员可以使基本类型或者构造类型。 3、特点 变量用.访问,指针用 ->访问。eg. node.num = 1; node->ame = abc; 共用体 1、共用体的作用 用覆盖技术,几个变量相互覆盖,从而使几个不同变量共占一段内存 的结构。共用体的所有成员都在一段内存中存放,起始地址一样,并且同一 时刻只能使用其中的一个成员变量。
2、结构体总空间大小,等于各成员总长度,共用体空间等于最大成 员占据的空间。 3、共用体不能赋初值而结构体可以。
2、共用体的定义 共用体如下所示, 其中 union 是共用体关键字,不能省略。node 是共用体名。 3、特点 用体内存长度是内部最长的数据类型的长度。 共用体的地址和内部各成员变量的地址都是同一个地址 主要区别 1、结构体每一位成员都用来表示一种具体事务的属性,共用体成员 可以表示多种属性(同一存储空间可以存储不同类型的数据) 。
共用体和结构体的区别
在 c++中,结构体(struct)和共用体(union)是两种很相似的复合 数据类型,都可以用来存储多种数据类型,但是两者还有很大的区别。 结构体 1、结构体的作用 在网络协议、通信控制、嵌入式系统的 C/C++编程中,我们经常要传 送的不是简单的字节流,而是多种数据组合起来的一个整体,其表现形式就 是一个结构体。 2、结构体的定义 结构体:是指定义相应的数据结构及相应的变量。 结构体如下所示,
结构体与共用体-枚举
枚举常量是枚举类型的成员,每个枚举常量都有一个整数值与之对应,默认从0 开始,也可以显式指定。
枚举变量
枚举变量的声明
使用枚举类型名称声明枚举变量,例如`enum Color color;`。
枚举变量的赋值
枚举变量只能赋值为枚举常量列表中定义的整数 值或对应的枚举常量名称。
枚举变量的使用
嵌套共用体
嵌套共用体是一个共用体内部包含另一个共 用体或结构体的情况。
共用体变量
声明
共用体变量的声明方式与结构体 变量类似,需要使用共用体类型 名来定义变量。
访问
访问共用体变量的成员需要使用 成员访问运算符(.),且每次只 能访问一个成员。
01
02
定义
共用体变量是用来存储共用体类 型数据的变量。
03
结构体与共用体-枚举
目录
• 结构体概述 • 共用体概述 • 枚举概述 • 结构体、共用体与枚举的关系 • 结构体、共用体与枚举的应用实例 • 总结与展望
01
结构体概述
定义与特点
01
结构体是一种用户自定义的数据类型,允许将不同类型的数据 组合成一个有机的整体。
02
结构体中的数据可以是基本数据类型,也可以是其他结构体类
未来发展趋势预测
01 02
结构化数据处理
随着大数据时代的到来,处理结构化数据变得越来越重要。结构体作为 一种表示结构化数据的数据类型,将在数据处理和分析领域发挥越来越 重要的作用。
内存优化
共用体可以在相同的内存位置存储不同的数据类型,从而节省内存空间。 在内存资源紧张的情况下,共用体的使用将变得更加重要。
04
当需要提高代码的可读性和可维护性时,可以使用枚举类型来代替一 些硬编码的常量值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十一章结构体和共用体11.1 本章基本知识结构11.2 知识难点解析1.结构体与共用体变量在计算机中占用多少内存?[解答] 结构体变量所占的内存长度等于所有各成员的长度之和,每个成员分别占有自己的内存单元;共用体变量所占的内存长度等于最长的成员的长度。
2.结构体和共用体的有几种不同的引用方法?[解答] 结构体和共用体一样,有两种引用办法,一种是采用成员(分量)运算符“.”;还有一种是采用指针的办法。
下面以结构体为例说明这两种不同的引用的方法。
struct stu{int num;char name[10];int age;} zhangsan, *lisi;要访问学生zhangsan年龄的办法有两种:zhangsan.age 或者(&zhangsan)—>age;要访问学生lisi年龄的办法也有两种:(*lisi).age 或者lisi—>age。
11.3 习题1.选择题(1).以下程序运行的输出结果是( )。
main(){union {char i[2];int m;}r;r.i[0]=2;r.i[1]=0;printf("%d\n",r.m);}A.2B.1C.0D.不确定[分析、解答] 答案为A。
本题涉及共用体的概念。
字符数组i[2]与整型变量m使用同一内存单元。
M占用2个字节,高字节对应i[1],低字节对应i[0],所以答案为A。
(2).有以下程序输出结果是( )。
#include<stdio.h>struct stu{int num;char name[10];int age;};void fun(struct stu *p){printf("%s\n",(*p).name);}main(){struct stu students[3]={{9801,"zhang",20},{9802,"Wang",19},{9803,"zhao",18}};fun(students+2);}A.ZhangB.ZhaoC.WangD.18[分析、解答]答案为B。
在main函数中,定义结构体类型数组student[3],并赋初值。
即student[0]={9801,〞zhang〞,20},student[1]={9802, 〞wang〞,19},student[2]={9803, 〞zhao〞,18},调用子函数fun,实参“student+2”为student[2]的首地址,则p指向student[2]的首地址,(*p).name即“zhao”。
(3).有下列程序输出结果是( )。
#include <stdio.h>main(){union{int k;char i[2];}*a,b;a=&b;a->i[0]=0x39;a->i[1]=0x38;printf("%x\n",a->k);}A.3839B.3938C.380039D.390038[分析、解答]答案为A。
题中a是指向共用体类型变量b的指针变量,整型变量k与字符数组i[2]共用。
一个存储单元,k的高位字节对应i[1],k的低位字节对应i[0].“0x39”表示十六进制数的39。
“%x”表示十六进制的格式输出。
(4).设有如下定义:struct num{ int a;float b;} data,*p;若有p=&data;则对data中的a 域的正确引用是( )。
A.(*p).data.aB.(*p).aC.p->data.aD.p.data.a[分析、解答]答案为B。
p指向结构体类型变量data的首地址,*p即代表data,因此答案为B。
(5).若有下面的说明和定义,则sizeof(struct aaa)的值是( )。
struct aaa{ int r1;double r2;float r3;union uuu{ char u1[5];long u2[2];}ua;}mya;A.30B.29C.24D.22[分析、解答] 答案为D。
这是结构体套用共用体的形式,共用体的长度为8。
sizeof 为长度运算符。
sizeof(struct aaa)等价于sizeof(mya)=2+8+4+8=22。
(6).设有以下定义typedef union{ long m;int k[5];char ch;} DATE;struct date{ int cat;DATE cow;double dog;} too;DATE max;则语句printf(〞%d〞,sizeof(struct date)+sizeof(max)))的执行结果是( )。
A.25B.30C.18D.8[分析、解答]答案为B。
本题用typedef声明新的类型名“DATE”来代替已有的类型名union。
sizeof是长度运算符。
max,cow都是共用体类型,长度为“int k[5]”的长度,即10。
所以:sizeof (struct date)+sizeof(max)=(2+10+8)+10=30。
(7).字符ˊ0ˊ的ASCII码的十进制数为48,且数组的第0个元素在低位,则以下程序的输出结果是( )。
#include <stdio.h>main(){ union{ int i[2];long m;char c[4];} r,*s=&r;s->i[0]=0x39;s->i[1]=0x38;printf(〞%c\n〞,s->c[0]);}A.39B.9C.38D.8[分析、解答]:答案为B。
“0x39”代表十六进制的39,即十进制的57,c[0] 对应i[0]的低字节,由于十进制的57在内存中不超过8个二进制位(大于255不可),所以对应c[0]的就是57。
而字符0的ASCII码的十进制数为48,57就对应字符‘9’。
因此答案为B。
(8).若已建立下面的链表结构,指针p,s分别指向图中所示的结点,则不能将所指的结点插入到链表末尾的语句组是( )。
data nextA. s->next=null;p=p->next;p->next=s;B. p=p->next;s->next=p->next;p->next=s;C. p=p->next;s->next=p;p->next=s;D. p=(*p).next;(*s).next=(*p).next;(*p).next=s;[分析、解答]:答案为C。
s->next=p;p->next=s使得p,s所指的节点构成了环路而不是链表。
(9).根据下面的定义,能打出字母M的语句是( )。
struct student{ char name[9];int age;}struct student class[10]={ 〞John〞,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]是结构体类型的数组,每个元素的长度是11,前9 个字符型的放名字,后两个整型的放年龄。
A是指“Adam”。
B是指d。
C 是指a。
D指M。
(10). 下列程序的执行结果为( )。
struct str{ char *s;int i;struct str *sip;}main(){ static struct str a[]={{"abcd",1,a+1},{"efgh",2,a+2},{"ijkl",3,a}};struct str *p=a;int i=0;printf("%s%s%s",a[0].s,p->s,a[2].sip->s);printf("%d%d",i+2,--a[i].i);printf("%c\n",++a[i].s[3]);}A.abcd abcd abcd 2 0 eB.abcd efgh ijkl 2 0 eC.abcd abcd ijkl 2 0 eD.abcd abcd abcd 2 1 e[分析、解答]:答案为 A。
(11). 下面程序的输出结果为( )。
struct st{ int x;int *y;} *p;int data[4]={10,20,30,40};struct st aa[4]={50,&data[0],60,&data[1],70,&data[2],80,&data[3]};main(){ p=aa;printf("%d\n",++p->x);printf("%d\n",(++p)->x);printf("%d\n",++(*p->y));}A.10B.50C. 51D.6020 60 60 7020 21 21 31[分析、解答]答案为C。
本题的说明中定义了一个名为st的结构体。
它由两个成员组成:一个是整型变量x;一个是指针变量。
在定义的同时说明了一个指向这一结构类型的指针变量p.数组每个元素是一个含有两个成员的struct st型的结构,并赋有初值。
在main函数中执行p=aa;语句后,p指向了数值的首地址,它们之间的关系如图所示:这里需要注意运算符的优先级,对于题目中涉及的运算符()、—>、++、*,其中括号最优先,其次是指向结构体成员运算符—>,下来是自增运算符++和指针运算符*,它们属于同级运算,其结合方向是“自右至左”。
参照上图可知,第一条printf语句的输出项++p→x是先找出p→(其值为50),再将其值自增1,取增值后的值,故输出51。
第二条printf语句的输出项为(++p)→x,它表示先将指针p自增1,指向aa数组的第二个元素aa[1],然后取其第一个成员aa[1].x的值。
故输出为60。
第三次的输出项为++(*p→y)。
此时p已指向aa[1],因此输出项等价于++(data[1]),先取出data[1]的值(20),再将其增1,故输出21。
由此可见,答案C正确。