文章目录
- 一、C 结构体
- 1. 定义结构体
- 2. 声明结构体变量
- 3. 初始化结构体变量
- 4. 访问结构体成员
- 5. 结构体数组
- 6. 结构体指针
- 7. 结构体嵌套
- 二、C 如何使用结构体
- 1. 定义结构体类型
- 2. 声明结构体变量
- 3. 初始化结构体变量
- 4. 访问结构体成员
- 5. 结构体指针
- 6. 在函数中使用结构体
- 7. 注意事项
- 三、相关链接
一、C 结构体
在C语言中,结构体(struct)是一种复合数据类型,它允许你将多个不同类型的数据项组合成一个单一的类型。结构体常用于表示具有多个相关属性的数据项,如一个学生的信息(包括学号、姓名、年龄等)。
1. 定义结构体
你可以使用 struct
关键字来定义一个新的结构体类型。例如,以下代码定义了一个名为 Student
的结构体,它包含学号(studentID
)、姓名(name
)和年龄(age
)三个成员:
struct Student {
int studentID;
char name[50];
int age;
};
2. 声明结构体变量
在定义了结构体类型之后,你可以声明该类型的变量。例如:
struct Student student1;
你也可以在定义结构体的同时声明变量:
struct Student {
int studentID;
char name[50];
int age;
} student1, student2; // 同时声明了student1和student2两个变量
3. 初始化结构体变量
你可以在声明时或稍后初始化结构体变量:
struct Student student1 = {12345, "Alice", 20}; // 声明并初始化
// 或者稍后初始化
struct Student student2;
student2.studentID = 67890;
strcpy(student2.name, "Bob"); // 注意:使用strcpy来复制字符串
student2.age = 22;
4. 访问结构体成员
使用点操作符(.
)来访问结构体变量的成员:
printf("Student ID: %d\n", student1.studentID);
printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);
5. 结构体数组
你也可以声明结构体数组,以存储多个结构体实例:
struct Student students[3];
// 初始化结构体数组
students[0] = (struct Student){1, "Alice", 20};
strcpy(students[1].name, "Bob");
students[1].studentID = 2;
students[1].age = 22;
// ... 类似地初始化students[2]
6. 结构体指针
你还可以使用指针来访问结构体:
struct Student *pStudent = &student1;
// 使用指针访问结构体成员
printf("Name: %s\n", pStudent->name); // 注意使用->操作符来访问指针指向的结构体成员
7. 结构体嵌套
一个结构体也可以包含另一个结构体类型的成员:
struct Address {
char street[100];
char city[50];
char country[50];
};
struct Student {
int studentID;
char name[50];
int age;
struct Address address; // 结构体嵌套
};
// 初始化并访问嵌套的结构体成员
struct Student student = {12345, "Alice", 20, {"123 Main St", "Springfield", "USA"}};
printf("Address: %s, %s, %s\n", student.address.street, student.address.city, student.address.country);
二、C 如何使用结构体
使用结构体(struct)在C语言中通常涉及定义结构体类型、声明结构体变量、初始化结构体变量、访问结构体成员等操作。以下是一个详细的使用结构体的示例:
1. 定义结构体类型
首先,你需要定义结构体类型。这可以通过struct
关键字来完成。
#include <stdio.h>
#include <string.h>
// 定义一个名为Point的结构体类型,包含x和y两个整型成员
struct Point {
int x;
int y;
};
// 定义一个名为Rectangle的结构体类型,包含两个Point类型的成员(表示左上角和右下角)
struct Rectangle {
struct Point topLeft;
struct Point bottomRight;
};
2. 声明结构体变量
定义了结构体类型之后,你可以声明该类型的变量。
int main() {
// 声明Point类型的变量p1和p2
struct Point p1, p2;
// 声明Rectangle类型的变量rect
struct Rectangle rect;
// ... 后续可以进行初始化等操作
return 0;
}
3. 初始化结构体变量
在声明结构体变量之后,你可以进行初始化。
int main() {
// ...
// 使用设计初始化(C99及更高版本支持)
struct Point p1 = {1, 2};
struct Point p2 = {.y = 4, .x = 3}; // 成员可以按照任意顺序初始化
// 初始化Rectangle类型的变量rect
struct Rectangle rect = {{1, 1}, {5, 3}}; // 初始化topLeft和bottomRight成员
// ...
return 0;
}
4. 访问结构体成员
你可以使用点号(.
)来访问结构体变量的成员。
int main() {
// ... 初始化p1, p2, rect的代码 ...
// 访问并打印Point结构体变量的成员
printf("p1.x = %d, p1.y = %d\n", p1.x, p1.y);
printf("p2.x = %d, p2.y = %d\n", p2.x, p2.y);
// 访问并打印Rectangle结构体变量的成员
printf("rect.topLeft.x = %d, rect.topLeft.y = %d\n", rect.topLeft.x, rect.topLeft.y);
printf("rect.bottomRight.x = %d, rect.bottomRight.y = %d\n", rect.bottomRight.x, rect.bottomRight.y);
// ...
return 0;
}
5. 结构体指针
你还可以使用指针来访问结构体的成员。这在你需要动态分配内存或者需要传递结构体到函数时特别有用。
int main() {
// ... 初始化p1, p2, rect的代码 ...
// 声明结构体指针并使其指向rect
struct Rectangle *pRect = ▭
// 使用指针访问结构体成员
printf("pRect->topLeft.x = %d, pRect->topLeft.y = %d\n", pRect->topLeft.x, pRect->topLeft.y);
// ... 类似地访问其他成员 ...
return 0;
}
6. 在函数中使用结构体
结构体也可以作为函数的参数或返回值。
// 定义一个函数,它接受一个Rectangle类型的参数并打印其左上角和右下角的坐标
void printRectangle(struct Rectangle rect) {
printf("TopLeft: (%d, %d)\n", rect.topLeft.x, rect.topLeft.y);
printf("BottomRight: (%d, %d)\n", rect.bottomRight.x, rect.bottomRight.y);
}
int main() {
// ... 初始化rect的代码 ...
// 调用函数打印Rectangle的内容
printRectangle(rect);
return 0;
}
7. 注意事项
- 结构体成员可以是任何数据类型,包括其他结构体类型。
- 结构体变量之间可以通过赋值操作进行拷贝,但是这样做会拷贝整个结构体(包括所有成员)。
- 结构体的大小取决于其成员的类型和数量,并且可能受到内存对齐的影响。
- 使用结构体时,要确保不要越界访问其成员,特别是当结构体
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C系列」C 简介
- 「C系列」C 基本语法
- 「C系列」C 数据类型
- 「C系列」C 变量及常见问题梳理
- 「C系列」C 常量
- 「C系列」C 存储类
- 「C系列」C 运算符
- 「C系列」C 判断/循环
- 「C系列」C 函数
- 「C系列」C 作用域规则
- 「C系列」C 数组
- 「C系列」C enum(枚举)
- 「C系列」C 指针及其应用案例