【试卷页数】:共80页/预览前10页
【试卷大小】:5.14M
【下载方式】:百度网盘
【 提 取 码】:ceqx
【下载地址】:https://www.kaoshiji.cn/jsjkxjs/652.html
教材名称:《C程序设计》
主编:谭浩强
出版社:清华大学出版社
版次:2017年8月第五版
书刊号:ISBN:978-7-302-48144-7
目 录
考试集教材配套题库介绍
一、单项选择题(60题)
二、多项选择题(40题)
三、判断题(40题)
四、填空题(40题)
五、名词解释题(40题)
六、简答题(40题)
七、论述题(15题)
八、材料分析题(5题)
考试集教材配套题库介绍
一、精准匹配教材,一站式学习解决方案
本网站专注于为高等教育教材,提供全章节配套题库服务,完全覆盖教材知识点。题库设计严格遵循教材章节结构,助力学习者系统掌握知识体系。
二、题库核心优势
1.题量丰富,解析详尽
每章独立题库,总计超千道高质量试题。每题均附标准答案+逐题解析,深入剖析考点,帮助学生举一反三。
2.灵活下载,多端适配
支持题库下载,满足打印、笔记等个性化学习需求。配套手机在线刷题小程序,随时随地碎片化学习,自动记录进度与错题。
小程序智能归纳易错题型,针对性强化薄弱环节。限时自测,还原真实考试环境,提升应试能力。
考试集官网[www.kaoshiji.cn]下载试题
关注微信公众号:百业先生,为您提供一站式服务。
扫一扫,码上刷题
考试集,让学习更简单!
第9章试卷-章节练习
第9章用户自己建立数据类型293
9.1定义和使用结构体变量293
9.1.1自己建立结构体类型293
9.1.2定义结构体类型变量 295
9.1.3结构体变量的初始化和引用296
9.2使用结构体数组300
9.2.1定义结构体数组300
9.2.2结构体数组的应用举例301
9.3结构体指针303
9.3.1指向结构体变量的指针303
9.3.2指向结构体数组的指针304
9.3.3用结构体变量和结构体变量的指针作函数参数306
9.4用指针处理链表309
9.4.1什么是链表 309
9.4.2建立简单的静态链表310
9.4.3建立动态链表311
9.4.4输出链表315
9.5共用体类型317
9.5.1什么是共用体类型317
9.5.2引用共用体变量的方式318
9.5.3共用体类型数据的特点319
9.6使用枚举类型322
9.7用typedef声明新类型名326
一、单项选择题(60题)
1.在C语言中,结构体类型是通过什么关键字来定义的?
A. class
B. struct
C. union
D. enum
正确答案:B
解析:在C语言中,struct关键字用于定义结构体类型。class是C++中的关键字,union用于定义共用体类型,enum用于定义枚举类型。
2.以下哪项不是结构体变量的正确初始化方式?
A. struct Point p = {1, 2};
B. struct Point p; p.x = 1; p.y = 2;
C. struct Point p = {.y = 2, .x = 1};
D. struct Point p = {x: 1, y: 2};
正确答案:D
解析:在C语言中,结构体变量可以通过直接赋值、逐个成员赋值或使用指定成员名的方式进行初始化。选项D的语法是错误的,它不是C语言中的有效初始化方式。
3.若有一个结构体数组struct Student students[10];,以下哪种方式不能正确访问数组中的元素?
A. students[0].name
B. students->name
C. *(students).name
D. &students[0]->name
正确答案:B
解析:students是一个结构体数组,不是结构体指针,因此不能直接使用->运算符。->运算符用于结构体指针访问其成员。正确的方式是使用.运算符(如A和C选项所示)或通过数组元素的地址加上->(如D选项的修正形式应为(&students[0])->name)。
4.在链表操作中,以下哪个操作通常用于在链表的末尾添加一个新节点?
A. 插入操作
B. 删除操作
C. 追加操作
D. 查找操作
正确答案:C
解析:在链表的数据结构中,追加操作指的是在链表的末尾添加一个新节点。插入操作通常指的是在链表的任意位置插入一个新节点,删除操作是移除链表中的一个节点,查找操作是在链表中寻找特定值的节点。
5.以下关于共用体(union)的说法中,哪一项是不正确的?
A. 共用体中的所有成员共享同一块内存空间
B. 共用体变量的大小等于其最大成员的大小
C. 可以同时存储共用体中所有成员的值
D. 共用体主要用于节省内存空间
正确答案:C
解析:共用体(union)的特点是所有成员共享同一块内存空间,因此同时只能存储一个成员的值,而不是所有成员的值。共用体变量的大小通常等于其最大成员的大小,这种数据结构主要用于节省内存空间,当你知道在任何时候只需要一个成员的值时。
6.在C语言中,若需要定义一个结构体类型Person,包含姓名、年龄和性别三个成员,以下哪个定义是正确的?
A. struct { char name[50]; int age; char gender; } Person;
B. struct Person { char name[50]; int age; char gender; };
C. typedef struct { char name[50]; int age; char gender; } Person;
D. struct Person { char name; int age; char gender[50]; };
正确答案:B
解析:选项A定义了一个匿名结构体并尝试将Person作为变量名,这是不正确的。选项C使用了typedef,它实际上定义了一个新类型名Person,但这不是直接定义结构体类型的标准方式(尽管它在某些情况下是有效的)。选项D中成员的类型和大小与题目要求不符。选项B正确地定义了一个名为Person的结构体类型,包含了所需的成员。
7.假设有一个结构体struct Date,包含年、月、日三个整型成员。以下哪个表达式不能用于初始化这个结构体的变量?
A. struct Date d = {2023, 4, 1};
B. struct Date d = {.year = 2023, .month = 4, .day = 1};
C. struct Date d; d.year = 2023; d.month = 4; d.day = 1;
D. struct Date d = {year: 2023, month: 4, day: 1};
正确答案:D
解析:在C语言中,结构体变量的初始化可以通过直接列出成员值(A选项),使用指定成员名的方式(B选项),或者逐个赋值(C选项)。D选项的语法是错误的,它不是C语言中的有效初始化方式。
8.若有一个结构体指针struct Student *ptr,指向一个结构体变量student,以下哪个表达式不能正确访问该结构体变量的成员?
A. ptr->name
B. (*ptr).name
C. &ptr->name
D. *ptr.name
正确答案:D
解析:在C语言中,->运算符用于通过结构体指针访问其成员(A选项)。(*ptr).name是ptr->name的等价形式,也正确(B选项)。&ptr->name获取成员name的地址,也是有效的(C选项)。但是,*ptr.name是错误的,因为.运算符的优先级高于*运算符,所以表达式会尝试先访问ptr.name(这是非法的,因为ptr是指针,不是结构体),然后再对结果进行解引用。正确的表达式应该是(*ptr).name或ptr->name。
9.在C语言中,枚举类型是通过哪个关键字来定义的?
A. struct
B. union
C. enum
D. typedef
正确答案:C
解析:在C语言中,enum关键字用于定义枚举类型。struct用于定义结构体类型,union用于定义共用体类型,typedef用于为现有类型定义新名称。
10.以下关于typedef的叙述中,哪一项是不正确的?
A. typedef可以为已有的数据类型定义新的类型名
B. 使用typedef可以增加代码的可读性和可维护性
C. typedef可以定义新的数据类型
D. typedef只是为现有类型定义了一个别名,并没有创建新的类型
正确答案:C
解析:typedef是C语言中的一个关键字,它允许程序员为现有的数据类型定义一个新的名字(别名)。这有助于增加代码的可读性和可维护性(A和B选项正确)。然而,typedef并没有创建新的数据类型,它只是为现有类型提供了一个别名(D选项正确)。因此,C选项是不正确的,因为typedef不能定义新的数据类型,它只能为现有类型定义别名。
11.在C语言中,若有一个结构体struct Rectangle,包含长度和宽度两个成员,且已定义了一个该结构体的变量rect。以下哪个表达式不能用于获取rect的长度?
A. rect.length
B. rect->length
C. (&rect)->length
D. *((struct Rectangle*)&rect).length
正确答案:B
解析:在C语言中,.运算符用于直接访问结构体变量的成员。->运算符用于通过结构体指针访问其指向的结构体变量的成员。选项A正确地使用了.运算符来访问rect的长度。选项B错误地使用了->运算符,这应该用于结构体指针,而不是结构体变量本身。选项C通过将rect的地址转换为结构体指针,并使用->运算符来访问长度,这是合法的。选项D通过类型转换和指针解引用来访问长度,虽然复杂,但也是正确的。
12.以下关于链表的说法中,哪一项是不正确的?
A. 链表是一种动态数据结构
B. 链表中的每个节点都包含数据域和指针域
C. 链表的长度是固定的,不能在运行时改变
D. 链表可以通过指针将各个节点连接起来
正确答案:C
解析:链表是一种动态数据结构,它的长度可以在运行时动态地增加或减少(A选项正确)。链表中的每个节点通常都包含数据域和指针域,数据域存储数据,指针域存储指向下一个节点的指针(B选项正确)。链表正是通过指针将各个节点连接起来的(D选项正确)。因此,C选项是不正确的,因为链表的长度不是固定的,它可以在运行时改变。
13.在C语言中,若需要定义一个枚举类型Color,包含红、绿、蓝三种颜色,以下哪个定义是正确的?
A. enum Color { RED, GREEN, BLUE };
B. typedef enum { RED, GREEN, BLUE } Color;
C. enum { RED, GREEN, BLUE } Color;
D. typedef { RED, GREEN, BLUE } Color;
正确答案:A
解析:在C语言中,定义枚举类型的正确语法是使用enum关键字后跟枚举类型的名称(可选)和枚举成员。选项A正确地定义了枚举类型Color及其成员RED、GREEN、BLUE。选项B虽然也定义了枚举类型,但使用了typedef来创建了一个新的类型名Color,这本身不是错误,但题目要求的是定义枚举类型,而不是类型别名。选项C的语法是错误的,因为它没有正确地指定枚举类型的名称。选项D的语法也是错误的,因为它没有使用enum关键字。
14.以下关于共用体(union)和结构体(struct)的说法中,哪一项是正确的?
A. 共用体和结构体都可以同时存储所有成员的值
B. 共用体和结构体在内存中的存储方式相同
C. 共用体所有成员共享同一块内存空间,而结构体则不是
D. 结构体所有成员共享同一块内存空间,而共用体则不是
正确答案:C
解析:共用体(union)的特点是所有成员共享同一块内存空间,因此同时只能存储一个成员的值。而结构体(struct)的每个成员都有自己独立的内存空间,可以同时存储所有成员的值。因此,选项C是正确的。选项A错误地指出结构体和共用体都可以同时存储所有成员的值。选项B错误地指出它们在内存中的存储方式相同。选项D的表述与事实相反。
15.在C语言中,若有一个指向结构体变量的指针ptr,以下哪个表达式不能用于修改该结构体变量的成员?
A. ptr->member = value;
B. (*ptr).member = value;
C. *ptr.member = value;
D. *((struct TypeName*)ptr).member = value;
正确答案:C
解析:在C语言中,->运算符和(*ptr).是等价的,都用于通过结构体指针访问其指向的结构体变量的成员。选项A和B都正确地使用了这两种方式来修改结构体变量的成员。选项D虽然复杂,但也是正确的,它首先通过类型转换将ptr转换为指向特定结构体类型的指针,然后使用->运算符来访问成员并修改它。选项C是错误的,因为.运算符的优先级高于*运算符,所以表达式会尝试先访问ptr.member(这是非法的,因为ptr是指针,不是结构体),然后再对结果进行解引用和赋值。正确的表达式应该是(*ptr).member = value;或ptr->member = value;。
16.在C语言中,若需定义一个结构体类型Person,包含姓名、年龄和性别三个成员,且姓名是字符串类型,年龄是整型,性别是字符型,以下哪个定义是正确的?
A. struct Person { char name; int age; char gender; };
B. struct Person { char name[]; int age; char gender; };
C. struct Person { char *name; int age; char gender; };
D. struct Person { char name[100]; int age; char gender; };
正确答案:D
解析:在C语言中,字符串通常通过字符数组或字符指针来表示。选项A中char name;只定义了一个字符,不能表示字符串。选项B中char name[];没有指定数组的大小,这在结构体定义中是不允许的。选项C中char *name;使用了字符指针,这是合法的,但需要额外分配内存来存储字符串。选项D中char name[100];定义了一个字符数组,可以存储最多99个字符的字符串(加上一个空字符\0作为字符串的结束标志),这是最常用的表示字符串的方式。因此,选项D是正确的。
17.以下关于结构体数组的说法中,哪一项是不正确的?
A. 结构体数组的每个元素都是结构体类型的变量
B. 结构体数组可以像普通数组一样通过下标访问
C. 结构体数组不能作为函数的参数
D. 结构体数组的每个元素都可以包含多个不同类型的数据
正确答案:C
解析:结构体数组的每个元素都是结构体类型的变量,这是正确的(A选项)。结构体数组可以像普通数组一样通过下标来访问每个元素,这也是正确的(B选项)。结构体数组的每个元素都可以包含多个不同类型的数据,这是结构体的特点之一(D选项)。而C选项是不正确的,因为结构体数组完全可以作为函数的参数,通常通过传递结构体数组的指针或直接传递结构体数组来实现。
18.在C语言中,若有一个指向结构体数组的指针ptr,且结构体类型为Student,以下哪个表达式不能用于访问数组中的第一个元素?
A.ptr[0]
B.*(ptr + 0)
C.*ptr
D. ptr->first_member
正确答案:D
解析:在C语言中,ptr[0]、*(ptr + 0)和*ptr都是等价的,都用于访问指针ptr指向的结构体数组中的第一个元素。而ptr->first_member是访问结构体指针ptr指向的结构体变量中的first_member成员的方式,但这并不适用于结构体数组。在结构体数组中,应该使用ptr[i].member或(*(ptr + i)).member的方式来访问第i个元素中的成员。因此,选项D是不正确的。
19.以下关于枚举类型的说法中,哪一项是正确的?
A. 枚举类型的每个枚举常量都可以是任意类型的值
B. 枚举类型的变量可以存储任意整型的值
C. 枚举类型的每个枚举常量在程序中都有唯一的整数值
D. 枚举类型的变量不能直接用于比较运算
正确答案:C
解析:枚举类型的每个枚举常量在程序中都会被赋予一个唯一的整数值,通常从0开始递增(除非显式地指定了其他值)。这是枚举类型的基本特点(C选项正确)。枚举常量的类型并不是任意的,而是枚举类型本身(A选项错误)。枚举类型的变量虽然可以存储整型的值,但通常只应存储该枚举类型定义的枚举常量的值(B选项错误)。枚举类型的变量可以直接用于比较运算(D选项错误),因为它们在底层实际上是整型数据。
20.在C语言中,若需要使用typedef为已有的结构体类型Point定义一个新的类型名PointType,以下哪个定义是正确的?
A. typedef Point PointType;
B. typedef struct Point PointType;
C. typedef struct { int x; int y; } PointType;
D. typedef struct Point { int x; int y; } PointType;
正确答案:A
解析:在C语言中,typedef用于为已有的类型定义一个新的类型名。如果Point已经是一个定义好的结构体类型(比如通过struct Point { int x; int y; };定义),那么可以使用typedef Point PointType;来为它定义一个新的类型名PointType(A选项正确)。选项B是错误的,因为typedef struct Point PointType;尝试重新定义Point结构体,而不是为它创建别名。选项C和D都定义了新的结构体类型,并同时为其创建了别名,但这并不是题目要求的。题目要求的是为已有的结构体类型创建别名,所以只有A选项是正确的。
21.在C语言中,若有一个结构体类型Rectangle,包含长度和宽度两个整型成员,以下哪个语句不能正确定义一个Rectangle类型的结构体变量?
A. Rectangle rect;
B. struct Rectangle rect;
C. Rectangle *rectPtr = malloc(sizeof(Rectangle));
D. struct { int length; int width; } rect;
正确答案:D
解析:在C语言中,如果已经通过typedef为结构体类型Rectangle定义了别名,那么可以直接使用Rectangle rect;来定义结构体变量(A选项正确)。如果没有使用typedef,则需要使用struct Rectangle rect;的形式(B选项正确)。C选项中的Rectangle *rectPtr = malloc(sizeof(Rectangle));是动态分配内存来创建一个Rectangle类型的结构体变量,这也是正确的,但需要注意在使用前应该检查malloc是否返回了NULL。而D选项定义了一个匿名结构体变量rect,这并不是Rectangle类型的变量,因此D选项是错误的。
22.以下关于链表的说法中,哪一项是不正确的?
A. 链表是一种动态数据结构
B. 链表的每个节点都包含数据域和指针域
C. 链表的节点必须连续存储在内存中
D. 链表的插入和删除操作通常不需要移动大量数据
正确答案:C
解析:链表是一种动态数据结构,它的节点可以在程序运行时动态地分配和释放(A选项正确)。链表的每个节点都包含数据域和指针域,数据域用于存储数据,指针域用于指向下一个节点(B选项正确)。链表的一个主要优点是它的节点不需要连续存储在内存中,这使得链表的插入和删除操作通常不需要移动大量数据(D选项正确)。因此,C选项是不正确的,因为链表的节点不需要连续存储。
23.在C语言中,若有一个指向结构体变量的指针ptr,且结构体类型为Circle,包含半径radius成员,以下哪个表达式不能用于访问该结构体的半径成员?
A. ptr->radius
B. (*ptr).radius
C. ptr.radius
D. *&ptr->radius
正确答案:C
解析:在C语言中,如果ptr是一个指向结构体变量的指针,那么可以通过ptr->member或(*ptr).member的方式来访问结构体成员(A和B选项正确)。*&ptr->radius实际上是对ptr->radius的取地址和解引用操作,结果仍然是ptr->radius的值(D选项正确,但不建议这样使用,因为它增加了不必要的复杂性)。而C选项中的ptr.radius是错误的,因为.运算符用于直接访问结构体变量的成员,而不是通过指针访问。正确的应该是使用->运算符来通过指针访问结构体成员。
24.以下关于共用体(union)的说法中,哪一项是正确的?
A. 共用体可以节省内存空间
B. 共用体的所有成员可以同时存储不同的值
C. 共用体的大小等于其所有成员大小之和
D. 共用体的每个成员都有独立的内存空间
正确答案:A
解析:共用体(union)是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。由于共用体的所有成员都共享同一块内存空间,因此它可以节省内存空间(A选项正确)。在任何时候,共用体只能存储其中一个成员的值,而不是同时存储所有成员的值(B选项错误)。共用体的大小通常等于其最大成员的大小,而不是所有成员大小之和(C选项错误)。共用体的成员并不拥有独立的内存空间,它们共享同一块内存(D选项错误)。
25.在C语言中,若需要使用typedef为枚举类型Color定义一个新的类型名ColorType,且枚举类型包含红、绿、蓝三个枚举常量,以下哪个定义是正确的?
A. typedef enum { RED, GREEN, BLUE } ColorType;
B. typedef enum Color { RED, GREEN, BLUE };
C. enum Color { RED, GREEN, BLUE } ColorType;
D. typedef enum ColorType { RED, GREEN, BLUE };
正确答案:A
解析:在C语言中,typedef用于为已有的类型定义一个新的类型名。如果要为枚举类型定义一个新的类型名,应该使用typedef enum { ... } NewTypeName;的形式。A选项正确地使用了这种形式,定义了枚举类型并为其创建了别名ColorType。B选项虽然定义了枚举类型Color,但没有使用typedef来创建别名。C选项错误地尝试将枚举类型与别名混合在一起定义。D选项错误地将ColorType放在了enum关键字之后,这会导致编译错误。因此,A选项是正确的。
26.在C语言中,若有一个结构体类型Person,包含姓名和年龄两个成员,以下哪个语句不能用于初始化该结构体类型的变量?
A. Person p = {"John", 25};
B. Person p = { .name = "John", .age = 25 };
C. struct Person p = {"John", 25};
D. Person p; p.name = "John"; p.age = 25;
正确答案:D
解析:在C语言中,结构体变量可以在定义时直接初始化。A选项使用了传统的初始化方式,按照成员顺序赋值。B选项使用了C99标准引入的指定初始化器(designated initializer),可以显式地指定要初始化的成员。C选项在结构体类型前加了struct关键字,这也是一种有效的初始化方式,特别是在没有使用typedef为结构体定义别名时。D选项虽然最终也能初始化结构体变量,但它不是一条初始化语句,而是先定义了一个未初始化的结构体变量p,然后通过两条赋值语句分别给成员赋值。因此,根据题目要求选择“不能用于初始化”的语句,D选项是正确的。
27.以下关于结构体数组的说法中,哪一项是不正确的?
A. 结构体数组的每个元素都是结构体类型的变量
B. 结构体数组可以存储多个相同类型的结构体数据
C. 结构体数组的大小等于其所有元素大小之和
D. 结构体数组的每个元素都必须同时初始化
正确答案:D
解析:结构体数组是由多个结构体类型的变量组成的数组,每个元素都是结构体类型的变量(A选项正确)。因此,结构体数组可以存储多个相同类型的结构体数据(B选项正确)。结构体数组的大小等于其所有元素大小之和,即数组中每个结构体变量的大小乘以数组的长度(C选项正确)。然而,结构体数组的每个元素并不需要同时初始化,可以在定义时只初始化部分元素,剩余的元素将自动初始化为零或保持未定义的状态(D选项错误)。
28.在C语言中,若有一个指向结构体数组的指针ptr,且结构体类型为Student,包含学号id和成绩score成员,以下哪个表达式不能用于访问数组第二个元素的学号成员?
A. ptr[1].id
B. (ptr+1)->id
C. *(ptr->id+1)
D. (&ptr[1])->id
正确答案:C
解析:在C语言中,如果ptr是一个指向结构体数组的指针,那么可以通过ptr[index].member或(ptr+index)->member的方式来访问数组中某个元素的成员。A选项使用了ptr[1].id,这是正确的访问方式。B选项使用了(ptr+1)->id,这也是正确的,因为它相当于ptr[1].id的指针形式。D选项使用了(&ptr[1])->id,这也是正确的,因为&ptr[1]取得了数组中第二个元素的地址,然后通过->运算符访问其成员。然而,C选项中的*(ptr->id+1)是错误的,因为ptr->id相当于(*ptr).id,即数组第一个元素的学号成员,然后*(ptr->id+1)尝试对这个成员的值进行解引用并偏移1个单位,这并不是访问数组中第二个元素的学号成员的正确方式。
29.以下关于共用体(union)和结构体(struct)的说法中,哪一项是正确的?
A. 共用体和结构体都允许成员占用独立的内存空间
B. 共用体和结构体都可以包含不同类型的成员
C. 共用体的大小等于其所有成员大小之和
D. 结构体的大小一定大于其任何单个成员的大小
正确答案:B
解析:共用体(union)和结构体(struct)是C语言中两种自定义的数据类型,它们都可以包含不同类型的成员(B选项正确)。然而,它们的内存布局和用途是不同的。共用体的所有成员共享同一块内存空间,即在同一时间只能存储一个成员的值,因此共用体的大小通常等于其最大成员的大小。结构体的每个成员都占用独立的内存空间,结构体的大小等于其所有成员大小之和(考虑到内存对齐)。因此,A选项和C选项都是关于共用体的错误说法。D选项也是错误的,因为结构体的大小虽然通常大于其任何单个成员的大小,但在某些特殊情况下(如成员类型相同且紧密排列时),结构体的大小可能等于或略大于其最大成员的大小。
30.在C语言中,若需要使用typedef为指向结构体Point的指针定义一个新的类型名PointPtr,以下哪个定义是正确的?
A. typedef Point* PointPtr;
B. typedef struct Point* PointPtr;
C. typedef Point Ptr PointPtr;
D. typedef struct { int x, y; }* PointPtr;
正确答案:B
解析:在C语言中,typedef用于为已有的类型定义一个新的类型名。如果要为指向结构体Point的指针定义一个新的类型名PointPtr,应该首先确保Point是一个已定义的结构体类型。然后,可以使用typedef struct Point* PointPtr;的形式来定义。A选项错误地省略了struct关键字,这在没有为结构体定义别名时是必需的。C选项的语法是错误的,它尝试将Ptr作为Point的一部分来定义,这不是有效的C语言语法。D选项虽然定义了一个匿名结构体并为其指针创建了别名PointPtr,但这并不是题目要求的为已存在的结构体Point的指针定义别名。因此,B选项是正确的。
31.在C语言中,若有一个结构体类型Rectangle,包含长度length和宽度width两个成员,且已定义了一个Rectangle类型的变量rect。以下哪个表达式不能用于获取rect的长度?
A. rect.length
B. rect->length
C. (&rect)->length
D. *(&rect.length)
正确答案:B
解析:在C语言中,.运算符用于直接访问结构体变量的成员。因此,A选项rect.length是正确的获取rect长度的方式。->运算符是用于通过结构体指针访问成员的,但在这里rect是一个结构体变量,不是指针,所以B选项rect->length是错误的。C选项(&rect)->length首先取得rect的地址,然后通过指针访问其length成员,这是正确的。D选项*(&rect.length)首先取得rect.length的地址,然后通过解引用操作获取其值,这也是正确的。
32.以下关于枚举类型(enum)的说法中,哪一项是不正确的?
A. 枚举类型是一种用户定义的类型
B. 枚举类型的每个枚举常量都代表一个整数值
C. 枚举类型的变量可以存储任意整数值
D. 枚举类型通常用于表示一组相关的常量
正确答案:C
解析:枚举类型(enum)是C语言中一种用户定义的类型,它允许程序员为一组相关的常量定义易于理解的名字(A选项正确)。在内部,每个枚举常量都被映射到一个整数值,通常是从0开始的连续整数(B选项正确)。枚举类型通常用于表示一组有限的、相关的常量,如一周的星期几、月份等(D选项正确)。然而,虽然枚举类型的变量在底层是用整数表示的,但它们并不等同于任意的整数值。枚举类型的变量只能存储该枚举类型定义的枚举常量之一,或者这些常量的组合(如果使用了位字段)。尝试将未定义的整数值赋给枚举类型的变量可能会导致编译警告或错误,且行为是未定义的。因此,C选项是不正确的。
33.在C语言中,若有一个指向结构体变量的指针p,且结构体类型为Circle,包含半径radius和圆心坐标center(center本身也是一个结构体类型),以下哪个表达式不能用于访问圆心的x坐标(假设center结构体有x和y两个成员)?
A. p->center.x
B. (*p).center.x
C. p.center->x
D. (&(*p))->center.x
正确答案:C
解析:在C语言中,->运算符用于通过结构体指针访问其成员。因此,A选项p->center.x是正确的访问圆心x坐标的方式。B选项(*p).center.x也是正确的,它首先通过解引用操作获取结构体变量的值,然后通过.运算符访问其center成员的x成员。D选项(&(*p))->center.x也是正确的,它首先通过解引用操作获取结构体变量的值,然后取该值的地址(实际上这个地址就是p),最后通过->运算符访问center成员的x成员。然而,C选项p.center->x是错误的,因为p是一个指针,应该使用->运算符来访问其指向的结构体的成员,而不是.运算符。正确的表达式应该是p->center->x或者(*p.center).x(但后者需要center是指针类型,这里假设center不是指针)。
34.在C语言中,以下哪个关键字用于定义一个新的类型名,而不创建该类型的新变量?
A. struct
B. union
C. enum
D. typedef
正确答案:D
解析:struct、union和enum都是C语言中用于定义新类型的关键字,但它们都会同时创建该类型的新变量(如果定义了变量的话)。struct用于定义结构体类型,union用于定义共用体类型,enum用于定义枚举类型。而typedef关键字则不同,它用于为已有的类型定义一个新的类型名,而不创建该类型的新变量。因此,D选项是正确的。
35.在C语言中,若有一个结构体类型Car,包含品牌brand、型号model和价格price三个成员,且已定义了一个Car类型的数组cars。以下哪个循环不能正确遍历数组cars并打印每辆车的品牌?
A. c for(int i = 0; i < N; i++) { printf("%s\n", cars[i].brand); }
B. c for(Car *p = cars; p < cars + N; p++) { printf("%s\n", p->brand); }
C. c Car *p = cars; for(int i = 0; i < N; p++, i++) { printf("%s\n", (*p).brand); }
D. c Car *p = cars; for(int i = 0; i < N; i++, p++) { printf("%s\n", p.brand); }
正确答案:D
解析:在C语言中,遍历结构体数组并访问其成员通常有多种方式。A选项使用数组下标的方式遍历数组,并正确地打印了每辆车的品牌。B选项使用指针的方式遍历数组,也正确地打印了每辆车的品牌。C选项同样使用指针的方式遍历数组,但在循环体中通过解引用操作获取结构体变量的值,并正确地打印了每辆车的品牌。然而,D选项在尝试通过指针打印品牌时使用了错误的语法。在C语言中,不能通过.运算符直接访问指针指向的结构体的成员,而应该使用->运算符。因此,D选项中的p.brand应该改为p->brand。所以,D选项是不能正确遍历数组并打印每辆车的品牌的循环。
36.在C语言中,若有一个结构体类型Person,包含姓名name、年龄age和地址address三个成员,且已定义了一个指向Person类型变量的指针p。以下哪个表达式不能用于访问该人的年龄?
A. p->age
B. (*p).age
C. p.age
D. *((*p).age)
正确答案:C
解析:在C语言中,->运算符用于通过结构体指针访问其成员,因此A选项p->age是正确的访问方式。B选项(*p).age也是正确的,它首先通过解引用操作获取结构体变量的值,然后通过.运算符访问其age成员。D选项虽然看起来复杂,但实际上也是正确的,(*p).age获取到的是age成员的值(假设是整数),然后通过*运算符再次解引用(这里实际上是多余的,因为age不是指针),最终仍然得到age的值。然而,C选项p.age是错误的,因为p是一个指针,应该使用->运算符来访问其指向的结构体的成员,而不是.运算符。
37.以下关于共用体(union)的说法中,哪一项是正确的?
A. 共用体中的所有成员都占用独立的内存空间
B. 共用体中的所有成员都同时存在于内存中
C. 共用体的大小等于其所有成员大小之和
D. 共用体中的成员可以是不同类型的数据,但不能是结构体类型
正确答案:B
解析:共用体(union)是C语言中一种特殊的用户定义类型,它允许在相同的内存位置存储不同的数据类型。共用体中的所有成员实际上都映射到同一块内存区域,因此它们不是独立存在的,而是“覆盖”在同一个内存位置上。所以A选项错误,共用体成员并不占用独立的内存空间。C选项也错误,共用体的大小通常等于其最大成员的大小(考虑到对齐等因素,可能稍大一些),而不是所有成员大小之和。D选项错误,共用体中的成员可以是不同类型的数据,包括结构体类型。因此,B选项是正确的,共用体中的所有成员都同时存在于内存中,但每次只能存储其中一个成员的值。
38.在C语言中,若有一个枚举类型Color,包含红(RED)、绿(GREEN)和蓝(BLUE)三个枚举常量。以下哪个表达式不能用于表示Color类型的变量?
A. Color color = RED;
B. enum Color color = GREEN;
C. int color = BLUE;
D. Color color; color = RED;
正确答案:C
解析:在C语言中,枚举类型是一种用户定义的类型,它允许程序员为一组相关的常量定义易于理解的名字。A选项和D选项都是正确的,它们分别使用了枚举类型名Color和枚举常量来定义和初始化枚举类型的变量。B选项也是正确的,它显式地使用了enum关键字来指定变量color的类型为Color枚举类型,并初始化为GREEN。然而,C选项是错误的,因为它将枚举类型的变量定义为了int类型,并尝试将枚举常量BLUE赋给它。虽然枚举常量在底层通常是用整数表示的,但枚举类型和整数类型在C语言中是两种不同的类型,不能直接互换。
39.在C语言中,若有一个结构体类型Student,包含学号id、姓名name和成绩score三个成员,且已定义了一个Student类型的数组students。以下哪个循环不能正确遍历数组students并打印每个学生的姓名?
A. c for(int i = 0; i < N; i++) { printf("%s\n", students[i].name); }
B. c Student *p = students; for(int i = 0; i < N; i++) { printf("%s\n", (p+i)->name); }
C. c Student *p = students; for(int i = 0; i < N; p++, i++) { printf("%s\n", p->name); }
D. c for(Student *p = students; p < students + N; p++) { printf("%s\n", p.name); }
正确答案:D
解析:A选项使用数组下标的方式遍历数组,并正确地打印了每个学生的姓名。B选项使用指针和数组下标结合的方式遍历数组,也正确地打印了每个学生的姓名。C选项使用指针自增的方式遍历数组,同样正确地打印了每个学生的姓名。然而,D选项在尝试通过指针打印姓名时使用了错误的语法。在C语言中,不能通过.运算符直接访问指针指向的结构体的成员,而应该使用->运算符。因此,D选项中的p.name应该改为p->name。所以,D选项是不能正确遍历数组并打印每个学生的姓名的循环。
40.在C语言中,以下哪个关键字或组合不能用于声明一个新的类型名?
A. typedef struct
B. typedef union
C. typedef enum
D. typedef int
正确答案:D
解析:typedef关键字在C语言中用于为已有的类型定义一个新的类型名。A选项typedef struct可以用于定义一个新的结构体类型名。B选项typedef union可以用于定义一个新的共用体类型名。C选项typedef enum可以用于定义一个新的枚举类型名。然而,D选项typedef int虽然看起来像是想要为int类型定义一个新的类型名,但实际上这是不必要的,因为int本身就是C语言中的一个基本类型名。typedef通常用于简化复杂类型(如结构体、共用体、枚举或指向这些类型的指针)的声明,而不是为基本类型定义新的名字。因此,D选项是不能用于声明一个新的类型名的组合。
下载地址
同类推荐
第10章试卷《C程序设计》谭浩强主编教材-清华大学出版社-2017年8月第五版-ISBN:978-7-302-48144-7-章节练习题库
加入收藏第8章试卷《C程序设计》谭浩强主编教材-清华大学出版社-2017年8月第五版-ISBN:978-7-302-48144-7-章节练习题库
加入收藏第7章试卷《C程序设计》谭浩强主编教材-清华大学出版社-2017年8月第五版-ISBN:978-7-302-48144-7-章节练习题库
加入收藏第6章试卷《C程序设计》谭浩强主编教材-清华大学出版社-2017年8月第五版-ISBN:978-7-302-48144-7-章节练习题库
加入收藏第5章试卷《C程序设计》谭浩强主编教材-清华大学出版社-2017年8月第五版-ISBN:978-7-302-48144-7-章节练习题库
加入收藏第4章试卷《C程序设计》谭浩强主编教材-清华大学出版社-2017年8月第五版-ISBN:978-7-302-48144-7-章节练习题库
加入收藏第3章试卷《C程序设计》谭浩强主编教材-清华大学出版社-2017年8月第五版-ISBN:978-7-302-48144-7-章节练习题库
加入收藏第2章试卷《C程序设计》谭浩强主编教材-清华大学出版社-2017年8月第五版-ISBN:978-7-302-48144-7-章节练习题库
加入收藏第1章试卷《C程序设计》谭浩强主编教材-清华大学出版社-2017年8月第五版-ISBN:978-7-302-48144-7-章节练习题库
加入收藏