自定义数据类型——初识
/* 引入: 学生:姓名,学号,年龄,成绩 请为学生们专门定制一个类型(创造一个类型) 结构体格式: struct 标识符 // 标识符即自定义类型的名称 { 成员; // 自己设置 }; // 这里要注意不要漏了分号 struct Students // 定义一个学生类型 { char name[12]; int id; int age; int score; }; 我们知道: 类型 变量名; int x; x = 10; // 赋值操作 ---初始化操作 int y = 10; 那么同理: 结构化类型 结构体变量名; struct Students stu_1; stu_1 = {"张三", 52, 18, 616}; // 为4个成员初始化 其他内容补充: 1.访问结构体变量的成员 stu_1.name; stu_1.id; stu_1.age; stu_1.score; 2.成员赋值 stu_1.name = "张三"; // 操作错误!! 正确操作为: 1.引入头文件<string.h> 2.strcpy(stu_1.name, "张三") // 作用:将后面字符串"复制到"前面 stu_1.id = 52; // 操作正确 stu_1.age = 18; // 操作正确 stu_1.score = 616; // 操作正确 */ # include <stdio.h> # include <string.h> // 定义一个学生类型,类似于创造int、long...这些类型,只不过学生类型是自定义罢了 struct Students { char name[12]; int id; int age; int score; }; int main() { struct Students stu_1; stu_1.age = 18; strcpy(stu_1.name, "张三"); printf("%s, %d\n", stu_1.name, stu_1.age); struct Students stu_2 = { "李四", 39, 17, 553 }; printf("%s, %d\n", stu_2.name, stu_2.age); }
自定义类型——给类型取别名
# include <stdio.h> struct Human // 定义一个 (struct)Human 类型 { char name[12]; int age; }; int main() { typedef int Myint; // 将int类型“取别名”为 Myint int x = 1; Myint y = 1; printf("%d\n", x + y); typedef struct Human hm; // 将 struct Human 类型取别名hm hm obj_1 = { "tomato", 18 }; printf("%s %d \n", obj_1.name, obj_1.age); return 0; } /* 补充: 在定义一个自定义类型的时候 往往直接当场取别名,而不是以后才取 e.g. struct Human // 定义一个 (struct)Human 类型 { char name[12]; int age; }typedef hm; // 直接当场取别名为hm */
自定义类型——结构体数组
# include <stdio.h> // 定义一个类型 struct Hero { char name[12]; int level; }typedef hr; // 取别名 int main() { // 初始化 hr hero_1 = { "钢铁侠", 8 }; hr hero_2 = { "蜘蛛侠", 7 }; // 初始化 hr hero_arr[9] = { { "惊奇队长", 10 }, { "美国队长", 7 }, { "雷神", 8 }, { "绿巨人", 9 }, // 剩下的使用默认 }; // 修改 hero_arr[0] = hero_1; return 0; }
自定义类型——联合类型
/* union语法形式如下所示: union 名字 // union 关键字是用来定义"联合类型" { 成员; // 见详情 } 详情: 修改一个成员的值,所有成员的值都会相应的产生变化 原因:所有成员,内存是相同的(---如何理解?) ---如何理解? 如下面代码中,num、d、ch 并不是各自独立占据一块内存, 而是先看谁最大,因为 double 占8个字节,比 int 占的4个字节 和 char 占的1个字节都要大,即 double > int > char 所以,所有的成员,即整体一共被分配了8个字节 因此,不同成员之间会出现联合占据某块内存空间的情况 而在本例中,double 占了8/8,int 占了4/8,char 占了1/8 */ # include <stdio.h> union HUMAN { int num; double d; char ch; }typedef hm; // 取别名 int main() { hm u_1; u_1.num = 66; u_1.d = 10.0; u_1.ch = 'A'; return 0; }
自定义类型——枚举
/* 语法: enum 名称 { 枚举元素0, 枚举元素1, 枚举元素2, 枚举元素3, 枚举元素4, 枚举元素5 } enum WEEK { Monday, // --> 0 Tuesday, // --> 1 Wednesday, // --> 2 Thurday, // --> 3 Friday = 15,// --> 15 Saturday, // --> 16 Sunday // --> 17 }; 枚举元素不能叫同样的名字,即使是不在同一个“枚举集合体”下 */ # include <stdio.h> // 创造一个关于星期的枚举类型 enum WEEK { Monday, // --> 0 Tuesday, // --> 1 Wednesday, // --> 2 Thurday, // --> 3 Friday, // --> 4 Saturday, // --> 5 Sunday // --> 6 }; int main() { enum WEEK week; // 定义变量 week,其类型为 enum WEEK week = Friday; printf("星期五是>>>%d \n", week); // 枚举配合 switch 使用,天生一对 switch (week) { case Monday: printf("%d \n", week); break; case Tuesday: printf("%d \n", week); break; case Wednesday: printf("%d \n", week); break; case Thurday: printf("%d \n", week); break; case Friday: printf("%d \n", week); break; case Saturday: printf("%d \n", week); break; case Sunday: printf("%d \n", week); break; default: printf("不存在这样的星期"); break; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构