内容正文:
举一反三考点练
《C语言程序设计》数组与结构类型-讲义
1. 掌握结构类型的定义,结构类型变量定义、初始化和输出;
2. 掌握一级指针访问变量和数组元素的方法;
3. 掌握 typedef 定义类型的别名;
知识点一 结构类型的定义,结构类型变量定义、初始化和输出
结构类型(Structure)是一种构造数据类型,它允许将不同类型的数据组合在一起形成一个新的数据类型。
一、结构类型的定义
结构类型的定义使用关键字 struct,其基本格式如下:
struct 结构名 {
成员类型1 成员名1;
成员类型2 成员名2;
...
成员类型n 成员名n;
};
其中,结构名是自定义的标识符,用于表示这种结构类型;成员类型和成员名分别表示结构中各个成员的数据类型和名称。
示例:
struct Student {
char name[20]; // 学生姓名
int age; // 学生年龄
float score; // 学生成绩
};
二、结构类型变量定义
定义结构类型变量有以下几种方式:
先定义结构类型,再定义变量:
struct Student {
char name[20];
int age;
float score;
};
struct Student stu1, stu2;
在定义结构类型的同时定义变量:
struct Student {
char name[20];
int age;
float score;
} stu1, stu2;
使用typedef关键字为结构类型定义别名,然后使用别名定义变量:
typedef struct {
char name[20];
int age;
float score;
} Student;
Student stu1, stu2;
三、结构类型变量的初始化
结构类型变量的初始化可以在定义时进行,如下所示:
struct Student {
char name[20];
int age;
float score;
} stu1 = {"张三", 20, 90.5}, stu2 = {"李四", 21, 85.0};
或者使用typedef定义的别名进行初始化:
Student stu1 = {"张三", 20, 90.5}, stu2 = {"李四", 21, 85.0};
四、结构类型变量的输出
要输出结构类型变量的成员,可以使用点操作符(.)来访问成员,然后进行输出。以下是一个示例:
#include <stdio.h>
struct Student {
char name[20];
int age;
float score;
};
int main() {
struct Student stu = {"张三", 20, 90.5};
printf("姓名:%s
", stu.name);
printf("年龄:%d
", stu.age);
printf("成绩:%.1f
", stu.score);
return 0;
}
输出结果为:
姓名:张三
年龄:20
成绩:90.5
1. (单项选择题)下列关于结构体的说法,错误的是?( )
A. 结构体可以将不同类型的数据组合在一起
B. 结构体成员不能包含其他结构体
C. 结构体成员可以是基本数据类型,也可以是数组
D. 结构体变量可以通过点操作符访问其成员
【答案】B
【解析】结构体成员可以包含其他结构体,形成嵌套结构体。
【要点】考查结构体的基本概念和使用。
1. (单项选择题)下列关于结构体变量初始化的说法,正确的是?( )
A. 结构体变量必须在定义时进行初始化
B. 结构体变量可以在定义后通过赋值进行初始化
C. 结构体变量的成员不能在定义时单独初始化
D. 结构体变量初始化时,成员的初始化顺序必须与定义顺序一致
【答案】B
【解析】结构体变量可以在定义后通过赋值进行初始化,成员的初始化顺序不必与定义顺序一致。
【要点】考查结构体变量的初始化方法。
2. (单项选择题)下列关于结构体成员访问的说法,错误的是?( )
A. 结构体成员可以通过点操作符访问
B. 结构体指针可以通过箭头操作符访问成员
C. 结构体成员的访问权限与成员的数据类型有关
D. 结构体成员的访问权限与成员的访问控制符有关
【答案】C
【解析】结构体成员的访问权限与成员的数据类型无关,而是与成员的访问控制符(如public、private等)有关,但在C语言中,结构体成员默认是public的。
【要点】考查结构体成员的访问方法。
3. (判断题)结构体变量可以在定义时进行部分成员的初始化。( )
【答案】√
【解析】结构体变量在定义时可以只对部分成员进行初始化,未初始化的成员将被自动初始化为0或空。
【要点】考查结构体变量初始化的灵活性。
1. (判断题)结构体中的成员不能是函数。( )
【答案】×
【解析】在C语言中,结构体中的成员不能是函数,但可以是指向函数的指针。
【要点】考查结构体成员的类型限制。
2. (填空题)在C语言中,定义结构体类型的关键字是______。
【答案】struct
【解析】在C语言中,使用关键字 struct 来定义结构体类型。
【要点】考查结构体类型的定义关键字。
3. (填空题)要访问结构体变量 stu 的 name 成员,应使用的表达式是______。
【答案】stu.name
【解析】通过点操作符(.)可以访问结构体变量的成员,表达式为 结构体变量名.成员名。
【要点】考查结构体成员的访问方法。
· 结构体是一种自定义的数据类型,可以包含多个不同类型的数据项,用于表示具有多个属性的对象。
· 结构体定义使用关键字 struct,并通过成员列表来指定结构体的组成,成员可以是基本数据类型、数组或其他结构体。
· 结构体变量可以通过在定义时直接初始化或在定义后通过赋值进行初始化,初始化时可以只对部分成员进行赋值。
· 访问结构体成员使用点操作符(.),如果结构体变量是指针,则使用箭头操作符(->)来访问成员。结构体成员的访问不受数据类型限制,但成员不能是函数,只能是指向函数的指针。
知识点二 一级指针访问变量和数组元素的方法
一、一级指针的概念
指针是一种数据类型,用于存储变量地址的变量。
一级指针是指直接指向数据类型的指针。
二、一级指针访问变量
定义指针变量:首先需要定义一个指针变量,用于存储其他变量的地址。例如:
int *p; // 定义一个整型指针变量p
获取变量地址:使用取地址运算符&获取变量的地址,并将其赋值给指针变量。例如:
int a = 10;
p = &a; // 将变量a的地址赋给指针变量p
访问变量:通过解引用运算符*来访问指针所指向的变量。例如:
int value = *p; // 通过指针变量p访问变量a的值,此时value的值为10
三、一级指针访问数组元素
数组名作为指针:在C语言中,数组名本身就是一个指向数组首元素的指针。
访问数组元素:通过指针运算符*和数组下标来访问数组元素。例如:
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 将数组首地址赋给指针变量p
// 访问数组元素
for (int i = 0; i < 5; i++) {
printf("%d ", *(p + i)); // 输出数组元素,等同于arr[i]
}
指针与数组的关系:指针可以通过加减整数来实现对数组元素的访问。例如:
int value = *(p + 2); // 访问数组arr的第3个元素,即arr[2],此时value的值为3
四、注意事项
指针变量必须进行初始化,否则可能指向未知地址,导致程序出错。
解引用空指针会导致程序崩溃,因此在解引用指针前,应确保指针非空。
指针的运算遵循指针算术规则,例如指针加减整数表示移动指针指向的位置。
1. (单项选择题)下列关于C语言一级指针的说法,错误的是?( )
A. 一级指针用于存储变量的地址
B. 一级指针可以通过解引用访问所指向的变量
C. 一级指针的运算只限于加法和减法
D. 一级指针可以指向任意类型的变量
【答案】D
【解析】一级指针只能指向特定类型的变量,不能指向任意类型的变量。
【要点】考查一级指针的基本概念。
1. (单项选择题)在以下代码中,哪个选项是正确的输出结果?( )
int arr[3] = {1, 2, 3};
int *p = arr;
printf("%d ", *(p + 2));
A. 1 B. 2 C. 3 D. 4
【答案】C
【解析】指针p指向数组arr的首元素,*(p + 2)表示访问数组的第3个元素,即arr[2],其值为3。
【要点】考查指针访问数组元素的方法。
2. (单项选择题)以下关于指针和数组的说法,正确的是?( )
A. 数组名是一个常量指针,不能改变其指向
B. 指针变量可以指向数组中的任意一个元素
C. 数组元素可以通过指针进行修改
D. 所有选项都正确
【答案】D
【解析】数组名是一个常量指针,指针变量可以指向数组中的任意一个元素,且可以通过指针修改数组元素。
【要点】考查指针与数组的关系。
3. (判断题)在C语言中,指针变量定义后可以直接使用,无需初始化。( )
【答案】×
【解析】指针变量定义后必须进行初始化,否则可能指向未知地址,导致程序出错。
【要点】考查指针变量的初始化。
1. (判断题)在C语言中,指针的算术运算只能对数组元素进行操作。( )
【答案】×
【解析】指针的算术运算不仅可以对数组元素进行操作,还可以对其他类型的数据进行操作。
【要点】考查指针的算术运算。
2. (填空题)在以下代码中,输出结果为“Hello World”,请填写空白处的内容。
char str[] = "Hello World";
char *p = ________;
printf("%s", p);
【答案】str
【解析】数组名str是一个指向数组首元素的指针,将其赋值给指针变量p,即可通过p访问数组内容。
【要点】考查数组名作为指针的使用。
3. (填空题)在以下代码中,输出结果为“3”,请填写空白处的内容。
int arr[3] = {1, 2, 3};
int *p = ________;
printf("%d", *p);
【答案】&arr[2] 或 (arr + 2)
【解析】指针p需要指向数组arr的第3个元素,即arr[2],因此可以将arr[2]的地址赋给p,或者使用数组名加上偏移量(arr + 2)。
【要点】考查指针访问数组元素的方法。
· 指针的基本功能:一级指针主要用于存储变量的地址,通过指针可以间接访问和修改变量的值,这对于操作内存中的数据至关重要。
· 指针与数组的关系:在C语言中,数组名被视为指向数组首元素的常量指针,因此可以通过指针的算术运算来访问数组中的元素。
· 指针的算术运算:一级指针可以进行加法和减法运算,用于遍历数组元素。指针加或减一个整数表示移动指针到相邻元素的位置。
· 指针的初始化与安全:在定义指针变量后,应立即对其进行初始化,以避免指向未知或非法的内存地址。在使用指针前,应检查其是否为空指针,以确保程序的安全性。
知识点三 typedef 定义类型的别名
1. typedef基本概念
typedef是C语言中的一个关键字,用于为已有的数据类型创建一个新的名字。通过typedef定义的类型别名,可以提高程序的可读性和可维护性。
2. typedef的使用格式
typedef 原类型 新类型名;
其中,原类型是C语言中已有的数据类型,新类型名是用户自定义的类型别名。
3. typedef的作用
(1)简化复杂的类型声明:使用typedef可以为复杂的类型声明定义一个简洁的别名,使代码更易于理解。
(2)提高程序的可移植性:通过typedef定义的类型别名,可以在不同的平台上轻松地修改数据类型,而无需修改大量代码。
(3)增强程序的可读性:类型别名可以使代码更具有描述性,让其他程序员更容易理解变量的用途。
4. typedef定义基本数据类型别名
例如,以下代码为int类型定义了一个新的别名INT:
typedef int INT;
之后,可以使用INT来声明整型变量:
INT a = 10;
5. typedef定义指针类型别名
例如,以下代码为指向int类型的指针定义了一个新的别名INT_PTR:
typedef int* INT_PTR;
之后,可以使用INT_PTR来声明指向整型的指针变量:
INT_PTR p = &a;
6. typedef定义结构体类型别名
例如,以下代码定义了一个结构体Student,并为它定义了一个别名STU:
typedef struct Student {
char name[20];
int age;
float score;
} STU;
之后,可以使用STU来声明结构体变量:
STU s1, s2;
7. typedef定义数组类型别名
例如,以下代码为包含10个int元素的数组定义了一个别名INT_ARRAY:
typedef int INT_ARRAY[10];
之后,可以使用INT_ARRAY来声明数组变量:
INT_ARRAY arr;
8. 注意事项
(1)typedef并不创建新的数据类型,只是为已有的数据类型起了一个新的名字。
(2)typedef声明的类型别名作用范围是从声明开始到文件结束,如果需要在多个文件中使用,可以在头文件中声明。
(3)在使用typedef定义类型别名时,要注意区分类型别名和变量声明,避免混淆。
1. (单项选择题)下列关于typedef的说法,错误的是?( )
A. typedef用于为已有的数据类型创建一个新的名字
B. 使用typedef可以提高程序的可读性和可维护性
C. typedef可以创建全新的数据类型
D. typedef声明的类型别名作用范围是从声明开始到文件结束
【答案】C
【解析】typedef并不创建新的数据类型,只是为已有的数据类型起了一个新的名字。
【要点】考查typedef的基本概念。
1. (单项选择题)以下哪个选项是正确的typedef定义方式?( )
A. typedef int INT = 10;
B. typedef struct { int a; } STRUCT;
C. typedef char* STRING;
D. typedef float[10] FLOAT_ARRAY;
【答案】C
【解析】选项C正确地定义了一个指向char类型的指针别名STRING。
【要点】考查typedef定义类型别名的正确格式。
2. (单项选择题)下列关于typedef定义结构体类型别名的说法,正确的是?( )
A. typedef struct { char name[20]; int age; } STUDENT;
B. STUDENT { char name[20]; int age; };
C. typedef struct STUDENT { char name[20]; int age; } STUDENT;
D. struct STUDENT { char name[20]; int age; };
【答案】C
【解析】选项C正确地定义了一个结构体类型别名STUDENT。
【要点】考查typedef定义结构体类型别名的正确方式。
3. (判断题)typedef关键字可以用于为任何数据类型定义别名,包括基本数据类型、指针类型、结构体类型等。( )
【答案】√
【解析】typedef确实可以用于为任何数据类型定义别名。
【要点】考查typedef的应用范围。
1. (判断题)使用typedef定义的类型别名可以改变原有数据类型的存储大小和存储方式。( )
【答案】×
【解析】typedef定义的类型别名不会改变原有数据类型的存储大小和存储方式。
【要点】考查typedef对数据类型的影响。
2. (填空题)使用typedef为double类型定义一个名为____的新类型别名。
【答案】DOUBLE
【解析】typedef double DOUBLE; 这样就为double类型定义了一个名为DOUBLE的新类型别名。
【要点】考查typedef定义基本数据类型别名的应用。
3. (填空题)以下代码定义了一个指向int类型指针的指针类型别名,请填空:typedef int ______ PTR;
【答案】* *
【解析】typedef int** PTR; 这样就定义了一个指向int类型指针的指针类型别名PTR。
【要点】考查typedef定义指针类型别名的应用。
· typedef的基本功能:typedef关键字在C语言中用于为已存在的数据类型创建一个新的别名,从而提高代码的可读性和可维护性,但它并不创建新的数据类型。
· 类型别名的应用范围:typedef可以用于基本数据类型、指针类型、数组类型、结构体类型等,其声明的类型别名的作用范围是从声明开始到文件结束,如果需要在多个文件中使用,可以在头文件中声明。
· typedef的正确使用:在使用typedef定义类型别名时,应遵循正确的语法格式,避免将其与变量声明混淆。正确的typedef定义不包含初始化值,也不改变原有数据类型的存储特性和大小。
· 类型别名的局限性:typedef定义的类型别名不会改变原有数据类型的存储大小、存储方式或其他属性,它仅仅是为原有类型提供了一个新的名称引用。
原创精品资源学科网独家享有版权,侵权必究!2
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$$