C语言自定义类型
1. 结构体
struct
结构体是C语言中用户自定义的数据类型,它允许用户封装不同类型的数据项。
#include <stdio.h>
#include <string.h>
// 定义一个结构体
struct Student {
int id;
char name[50];
float score;
};
int main() {
// 创建并初始化结构体变量
struct Student s1 = {1001, "张三", 85.5};
// 访问结构体成员
printf("学生ID: %d\n", s1.id);
printf("学生姓名: %s\n", s1.name);
printf("学生成绩: %.1f\n", s1.score);
// 修改结构体成员
s1.score = 90.0;
strcpy(s1.name, "李四");
printf("修改后的成绩: %.1f\n", s1.score);
printf("修改后的姓名: %s\n", s1.name);
return 0;
}
输出结果:
学生ID: 1001
学生姓名: 张三
学生成绩: 85.5
修改后的成绩: 90.0
修改后的姓名: 李四
结构体的特点:
- 可以包含多个不同类型的数据项。
- 使用点运算符(.)访问成员。
- 可以嵌套定义。
- 可以作为函数参数和返回值。
2. 联合体
union
联合体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。
#include <stdio.h>
// 定义一个联合体
union Data {
int i;
float f;
char str[20];
};
int main() {
// 创建联合体变量
union Data data;
// 使用整型成员
data.i = 10;
printf("整型值: %d\n", data.i);
// 使用浮点型成员
data.f = 220.5;
printf("浮点型值: %.1f\n", data.f);
// 使用字符数组成员
strcpy(data.str, "C Programming");
printf("字符串值: %s\n", data.str);
// 显示联合体大小
printf("联合体大小: %lu\n", sizeof(data));
return 0;
}
输出结果:
整型值: 10
浮点型值: 220.5
字符串值: C Programming
联合体大小: 20
联合体的特点:
- 所有成员共享同一块内存。
- 一次只能使用一个成员。
- 大小由最大成员决定。
- 用于节省内存,但使用时需要小心。
3. 枚举
enum
枚举是C语言中的一种基本数据类型,用于定义命名整型常量。
#include <stdio.h>
// 定义枚举类型
enum WeekDay {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
int main() {
// 创建枚举变量
enum WeekDay today = Wednesday;
// 使用枚举
printf("今天是周%d\n", today + 1);
// 遍历枚举
for (enum WeekDay day = Monday; day <= Sunday; day++) {
printf("%d ", day);
}
printf("\n");
return 0;
}
输出结果:
今天是周3
0 1 2 3 4 5 6
枚举的特点:
- 默认从0开始,依次递增。
- 可以显式指定枚举常量的值。
- 增加代码的可读性和可维护性。
- 编译器会将枚举类型当作整型处理。
4. 类型定义
typedef
typedef用于为现有数据类型创建新名称,提高代码的可读性和可移植性。
#include <stdio.h>
// 使用typedef定义新类型
typedef unsigned long ulong;
typedef struct {
int x;
int y;
} Point;
int main() {
// 使用typedef定义的类型
ulong big_number = 1234567890UL;
Point p1 = {10, 20};
printf("大数: %lu\n", big_number);
printf("点坐标: (%d, %d)\n", p1.x, p1.y);
// 定义函数指针类型
typedef int (*MathFunc)(int, int);
// 示例函数
int add(int a, int b) { return a + b; }
// 使用函数指针类型
MathFunc operation = add;
printf("10 + 20 = %d\n", operation(10, 20));
return 0;
}
输出结果:
大数: 1234567890
点坐标: (10, 20)
10 + 20 = 30
typedef的特点和用途:
- 简化复杂的声明,如函数指针。
- 提高代码可读性。
- 方便跨平台开发,隐藏平台相关的实现细节。
- 常用于为结构体、联合体等复杂类型创建简洁的别名。