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.rhkb.cn/news/251045.html

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

相关文章

【Qt5小项目】接金币小游戏

代码量在250行左右&#xff0c; 需要源码的可以私信我。

CCReportAdv的一个配置技巧

关于CCReportAdv CCReportAdv是我们推出的基于经典WinCC/TIA WinCC Prof.的一款报表控件。它支持导入Excel模板&#xff0c;可以灵活生成美观的数据报表。 配置示例 CCReportAdv功能非常强大。通过简单的配置就可以生成客户需要的报表。以下面这款报表为例&#xff0c;参见下面…

Multi ElasticSearch Head插件基本操作

Multi ElasticSearch Head插件安装好之后我们可以进行一些基本的操作。 1、复合查询 因为ES提供了一些Restful风格的接口&#xff0c;可以让任何语言去调用&#xff0c;因此我们可以将之前的请求地址粘贴到Multi ElasticSearch Head插件里面&#xff0c;选择GET请求方式&#x…

软件测试学习笔记-测试用例的编写

7中测试分类 按照阶段可划分单元测试、集成测试、系统测试、验收测试。代码可见度划分黑盒测试、灰盒测试、白盒测试 单元测试&#xff1a;针对源代码的测试 集成测试&#xff1a;针对接口进行测试 系统测试&#xff1a;针对功能和非功能的测试 验收测试&#xff1a;公测、内测…

Apache POI与easyExcel:Excel文件导入导出的技术深度分析

在处理Excel文件时&#xff0c;Java开发者经常会面临多种选择&#xff0c;其中Apache POI和easyExcel是两个非常受欢迎的选择。这两个库都提供了强大的Excel文件处理功能&#xff0c;但在性能、内存使用、API设计以及扩展性方面有所不同。本文将深入分析Apache POI和easyExcel在…

Git 实战场景过程(工作总结篇)

目录 前言1. Git远程仓库建立分支&#xff0c;本地未显示1.1 问题所示1.2 知识补充 2. Git暂存内容切换分支2.1 问题所示2.2 知识补充 3. Git放弃修改数据3.1 问题所示3.2 知识补充 4. git merge合并查看差异 前言 主要总结工作中的疑惑点&#xff0c;如果你也有相应的场景&am…

【Linux网络编程一】网络基础1(网络框架)

【Linux网络编程一】网络基础1&#xff08;网络框架&#xff09; 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点&#xff1a;网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装…

20.HarmonyOS App(JAVA)表格布局Layout使用方法

ability_main.xml&#xff0c;实现计算器键盘按钮 <?xml version"1.0" encoding"utf-8"?> <TableLayoutxmlns:ohos"http://schemas.huawei.com/res/ohos"ohos:height"match_parent"ohos:width"match_parent"oho…

【Midjourney】新手指南:命令

1./ask 向Midjourney提问&#xff0c;不过问题和回答都是英文的&#xff0c;例如&#xff1a; 2./blend 将两张图片合并为一张 ​ 3./describe 上传一张图片&#xff0c;Midjourney会生成四组该图片相关的关键词&#xff0c;可以使用这些关键词再生成图片。 ​ 4./turbo …

数据结构中的时间复杂度和空间复杂度基础

目录 数据结构 数据结构中的基本名词 数据 数据对象 数据元素 数据项 数据类型 数据对象、数据元素和数据项之间的关系 数据结构及分类 逻辑结构 物理结构 算法 算法的特点 算法设计上的要求 算法效率的衡量 时间复杂度 大O渐进表示法 最坏情况和平均情况 常…

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

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

【开源】基于JAVA+Vue+SpringBoot的河南软件客服系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

css新手教程

css新手教程 课程&#xff1a;14、盒子模型及边框使用_哔哩哔哩_bilibili 一.什么是CSS 1.什么是CSS Cascading Style Sheet 层叠样式表。 CSS&#xff1a;表现&#xff08;美化网页&#xff09; 字体&#xff0c;颜色&#xff0c;边距&#xff0c;高度&#xff0c;宽度&am…

Node.js-1

Node.js 简介 定义&#xff1a;Node.js 是一个跨平台 JavaScript 运行环境&#xff0c;使开发者可以搭建服务器端的 JavaScript 应用程序 为什么 Node.js 能执行 JS 代码&#xff1a; Chrome 浏览器能执行 JS 代码&#xff0c;依靠的是内核中的 V8引擎&#xff08;即&#x…

【Iot】什么是串口?什么是串口通信?串口通信(串口通讯)原理,常见的串口通信方式有哪些?

串口通信原理 1. 串口2. 串口通信4. 波特率与比特率5. 帧格式3. 串口通讯的通讯协议3.1. RS2323.2. RS485 总结 1. 串口 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口。 串口可…

python二维高斯热力图绘制简单的思路代码

import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter import cv2# 生成一个示例图像 image_size 100 image np.zeros((image_size, image_size))# 在图像中心创建一个高亮区域 center_x, center_y image_size // 2, image_size …

[工具探索]Safari 和 Google Chrome 浏览器内核差异

最近有些Vue3的项目&#xff0c;使用了safari进行测试环境搞开发&#xff0c;发现页面存在不同程序的页面乱码情况&#xff0c;反而google浏览器没问题&#xff0c;下面我们就对比下他们之间的差异点&#xff1a; 日常开发google chrome占多数&#xff1b;现在主流浏览器 Goog…

【LeetCode: 292. Nim 游戏+ 博弈问题】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

MagicVideo-V2:多阶段高保真视频生成框架

本项工作介绍了MagicVideo-V2&#xff0c;将文本到图像模型、视频运动生成器、参考图像embedding模块和帧内插模块集成到端到端的视频生成流程中。由于这些架构设计的好处&#xff0c;MagicVideo-V2能够生成具有极高保真度和流畅度的美观高分辨率视频。通过大规模用户评估&…

(bean配置类的注解开发)学习Spring的第十三天

bean配置类的注解开发 问题提出 用类充当配置文件 applicationcontext.xml : Configuration注解标识此类为配置类,替代原有xml文件 看原配置文件applicationcontext.xml代码 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http:/…