C语言-2

自定义类型

基本认识

/*引入:学生:姓名,学号,年龄,成绩请为学生们专门定制一个类型(创造一个类型)结构体格式: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类型“取别名”为 Myintint x = 1;Myint y = 1;printf("%d\n", x + y);typedef struct Human hm;    // 将 struct Human 类型取别名hmhm 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,        // --> 0Tuesday,    // --> 1Wednesday,    // --> 2Thurday,    // --> 3Friday = 15,// --> 15Saturday,    // --> 16Sunday        // --> 17};枚举元素不能叫同样的名字,即使是不在同一个“枚举集合体”下*/# include <stdio.h>// 创造一个关于星期的枚举类型
enum WEEK
{Monday,            // --> 0Tuesday,        // --> 1Wednesday,        // --> 2Thurday,        // --> 3Friday,            // --> 4Saturday,        // --> 5Sunday            // --> 6
};int main()
{ enum WEEK week;    // 定义变量 week,其类型为 enum WEEKweek = 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;
}

预处理

基本认识

/*---用 # 号开头的命令是预处理命令---“预处理”即:预先处理,在编译前对代码进行一个预先处理include <文件.h>    // 这个是文件包含命令总上所述, # include <stdio.h>    即是:执行“预处理文件包含stdio.h”
*/

# include

/*当 main.c 这个主文件越写越大的时候我们可以将它其中的某些部分,通过写到其他文件的方式来达到将代码有条理地进行布局分离的目的从而实现高效维护和管理的目标如下所示:
*/

在这里插入图片描述

# define

/*1. # define 宏定义命令:使用一个表示符“表示”(或者说“完全替代”)一个字符串2. 语法:# define    宏名    字符串
*/# include <stdio.h># define unint    unsigned int    // 宏名的规范写法为“全大写”,即 UNINT。
# define PI        3.14f
# define NAME    "tomato"
# define A        num * 2 + 1
# define B        (num * 2 + 1)int main()
{    unint num = 1;printf("圆周率%f \n", PI);printf("我的名字%s \n", NAME);printf("结果%d \n", 3 * A);        // 结果:7printf("结果%d \n", 3 * B);        // 结果:9//printf("", );return 0;
}
# include <stdio.h># define M(x)        x*x+3*x
# define P(a,b)        a + bint main()
{    int res = M(2);printf("结果为 %d \n", res);res = M(6);printf("结果为 %d \n", res);res = M(3 + 3);printf("结果为 %d \n", res);res = M(2 * 3);printf("结果为 %d \n", res);res = P(1, 2);printf("%d \n", res);return 0;
}/*运行结果——————结果为 10结果为 54结果为 27结果为 543请按任意键继续. . .
*/
# include <stdio.h># define    N(a,b)    a = a ^ b; b = a ^ b; a = a ^ b;    // ^ 异或,详情见底部
// 当一行内容过多的时候,可以用"\"符号实现“视觉上发生换行但代码本质还是一行”int main()
{    int n = 9, m = 8;printf("%d %d \n", n, m);N(n, m);printf("%d %d \n", n, m);return 0;
}/*运行结果——————9 88 9请按任意键继续. . .
*//*上面的异或原理:打个比方a=11011,b=10101a和b做异或得到 01110将他赋值给a,则a=01110(a=a^b,a承载着a和b的不同),接着将a(01110)和b(10101)做异或得 11011发现就是原来a的值于是将它赋值给b,b=11011,则b现在就是a原来的值了(b=a^b),再将a(01110)和b(11011)异或得10101发现就是原来b的值,将它赋值给a,a=10101,则a现在就是b原来的值(a=a^b)这样就实现了互换a和b的值
*/
# include <stdio.h># define    STR(s)    #s
# define    NUM1(a,b)    a##e##b        // 连接成aeb
# define    NUM2(a,b)    a##b##99    // 连接成ab99int main()
{    printf("%s \n", "abc123");printf("%s \n", STR("abc123"));printf("%s \n", STR(abc123));printf("%f \n", NUM1(1.23, 3));        // 连接成aeb,即 1.23e3 => 1.23 * 1000printf("%d \n", NUM2(12, 5));        // 连接成ab99,即 12599return 0;
}/*运行结果——————abc123"abc123"abc1231230.00000012599请按任意键继续. . .
*//*上面的异或原理:打个比方a=11011,b=10101a和b做异或得到 01110将他赋值给a,则a=01110(a=a^b,a承载着a和b的不同),接着将a(01110)和b(10101)做异或得 11011发现就是原来a的值于是将它赋值给b,b=11011,则b现在就是a原来的值了(b=a^b),再将a(01110)和b(11011)异或得10101发现就是原来b的值,将它赋值给a,a=10101,则a现在就是b原来的值(a=a^b)这样就实现了互换a和b的值
*/

条件编译

# include <stdio.h>
/*条件编译(多种类型)1.    #if ... #endif        (可以穿插 #elif、#else)2.    #ifdef ... #endif    (可以穿插 #else)    3.    #ifndef ... #endif    (可以穿插 #else)
*/# define NAME    // 对 NAME 进行宏定义,定义完成后,NAME就是宏名int main()
{    
# if 1 - 1printf("My name is %s.\n", "tomato");
# elif 0printf("My name is %s.\n", "banana");
# elseprintf("My name is %s.\n", "apple");
# endif# ifdef NAME        // 判断 NAME 是否为宏名,即是否进行了宏定义printf("111 \n");
# endif# ifndef NAME        // if-not-defprintf("222 \n");
# endifreturn 0;
}
/*使用场景:我们在 main.c 文件中编写代码时,有可能因为精神疲劳,而不小心造成错误例如:不小心引入了多次头文件<xxx.h>而导致出现“重定义”的情况我们如何解决这个问题?(下面有两个解决方案)方案1-----删除多余“引入头文件”的代码方案2-----我们能否在头文件上面做些手脚?使得它不论引入多少次,都只会执行一次。
*/// 下面是头文件里面的代码
// 我们通过“条件编译”的知识来实现“方案2”#ifndef MYFILE_H    // 判断:MYFILE_H 没有被定义?(ifndef => if-not-def)
#define MYFILE_H
struct Mystruct
{int num;
};
#endif                // 如果 #ifndef 的判断结果为‘错’,将跳到这行,直接结束

文件操作

/*1.文件路径:相对路径/绝对路径2.根目录---如:C盘、D盘、E盘3.操作文件:1.单个字符读写2.字符串读写3.格式化读写4.二进制形式读写5.指定位置读写
*/
# include <stdio.h>int func_1();    // 声明int main()
{FILE file;func_1();return 0;
}// 1.单个字符读写
int func_1()
{// 打开文件 ==》 (读)操作文件 ==》 关闭文件 ==> 打开文件 ==》 (写)操作文件 ==> 关闭文件// 定义变量:文件FILE* file = NULL;// 打开文件:路径,打开方式file = fopen("/test.txt", "r");// (读)操作文件:char ch = 0;ch = fgetc(file);printf("%c \n", ch);    // 输出ch的内容putchar(ch);    // 也是输出ch的内容// 关闭文件:fclose(file);file = NULL;// 打开文件:注意!以 w 操作文件时,文件由"关闭状态"转为"打开状态"会清空文件里面的内容file = fopen("test.txt", 'w');// (写)操作文件:fputc('M', file);// 关闭文件:fclose(file);file = NULL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/451364.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【洛谷】P2392 kkksc03考前临时抱佛脚

本题最重要的思路是&#xff1a;将题目转化为 01 背包模型。 注意点&#xff1a; &#xff08;1&#xff09;要求最短时间&#xff0c;则需让左右脑花费的时间最接近&#xff0c;极限状态下是左脑时间和右脑时间相等&#xff0c;且等于 m sum / 2&#xff08;其中sum是一道…

如何使用项目管理工具进行任务分配和进度跟踪

项目管理是一项重要的工作&#xff0c;有效的任务分配和进度跟踪是项目成功的关键因素。 项目经理可以选择合适的项目管理工具来管理项目&#xff0c;在选择项目管理工具时&#xff0c;需要根据项目的特点和需求进行评估。本文将介绍如何使用项目管理工具来进行任务分配和进度…

已解决: ModuleNotFoundError: No module named ‘tensorflow‘ 问题

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【蓝桥杯冲冲冲】[NOIP2001 普及组] 装箱问题

蓝桥杯备赛 | 洛谷做题打卡day26 文章目录 蓝桥杯备赛 | 洛谷做题打卡day26题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V&#xff0c;同时有 n n n 个物品&#xff0c;每…

2024年【熔化焊接与热切割】考试题及熔化焊接与热切割操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试题根据新熔化焊接与热切割考试大纲要求&#xff0c;安全生产模拟考试一点通将熔化焊接与热切割模拟考试试题进行汇编&#xff0c;组成一套熔化焊接与热切割全真模拟考试试题&#xff0c;学员可通…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书类别添加代码逻辑实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

大模型增量预训练新技巧:解决灾难性遗忘

大家好&#xff0c;目前不少开源模型在通用领域具有不错的效果&#xff0c;但由于缺乏领域数据&#xff0c;往往在一些垂直领域中表现不理想&#xff0c;这时就需要增量预训练和微调等方法来提高模型的领域能力。 但在领域数据增量预训练或微调时&#xff0c;很容易出现灾难性…

c++重载、隐藏和覆盖

重载 函数名字相同&#xff0c;但参数列表或者返回值不同一组函数要重载必须处在同一作用域中 class Base { public:Base(int data0):m_a(data){}void show(){cout<<"Base::show()"<<endl;}void show(int){cout<<"Base:show(int)"<&l…

STM32--SPI通信协议(2)W25Q64简介

一、W25Q64简介 1、W25Qxx中的xx是不同的数字&#xff0c;表示了这个芯片不同的存储容量&#xff1b; 2、存储器分为易失性与非易失性&#xff0c;主要区别是存储的数据是否是掉电不丢失&#xff1a; 易失性存储器&#xff1a;SRAM、DRAM&#xff1b; 非易失性存储器&#xff…

YOLOv8进阶 | 如何用yolov8训练自己的数据集(以安全帽佩戴检测举例)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv8是一种目标检测算法&#xff0c;它是YOLO&#xff08;You Only Look Once&#xff09;系列算法的最新版本。本节课就带领大家如何基于YOLOv8来训练自己的目标检测模型&#xff0c;本次作者就以安全帽佩戴检测为案例进…

C#(C Sharp)学习笔记_前言及Visual Studio Code配置C#运行环境【一】

前言 这可以说是我第一次正式的踏入C#的学习道路&#xff0c;我真没想过我两年前是怎么跳过C#去学Unity3D游戏开发的&#xff08;当然了&#xff0c;游戏开发肯定是没有成功的&#xff0c;都是照搬代码&#xff09;。而现在&#xff0c;我真正地学习一下C#&#xff0c;就和去年…

2024亿级密码泄露事件:涉及7084万个邮箱账号

近日&#xff0c;热门漏洞通知服务HIBP所有者特洛伊・亨特&#xff08;Troy Hunt&#xff09;发布博文&#xff0c;表示在暗网上发现了超大规模的泄漏数据集&#xff0c;被称为Naz.API列表。该数据集包含7084万个电子邮件地址以及超过1亿个密码凭证&#xff0c;至少有超过40万 …