自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 单链表应用

【代码】单链表应用。

2024-08-31 11:59:01 537

原创 单链表

只需要将火车里的某节车厢去掉/加上,不会影响其他车厢,每节车厢都是独立存在,并且车厢是独立存在的,且每节车厢都有车门,假设每节车厢的车门都是锁上的状态,需要不同的钥匙才能解锁,每次只能携带一把钥匙的情况下通过每节车厢里都放一把下一节车厢的钥匙,从而实现从车头走到车尾。当我们想要从第一个节点走到最后一个节点时,只需要在前一个节点拿上下一个节点的地址(下一个节点的钥匙)就可以。实际中使用的链表数据结构都是带头双向循环链表。节点的组成主要有两个部分:当前节点要保存的数据和保存下一个节点的地址(指针变量)

2024-08-31 11:51:20 836

原创 顺序表

静态顺序表缺陷:空间给少了不够用,给多了造成空间浪费。...线性表在逻辑上是线性结构,是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。线性表(linear list)是 n 个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使。顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。静态顺序表:使用定长数组存储元素。1> 顺序表和数组的区别。

2024-08-30 20:21:09 474

原创 预处理详解(二)

编译器提允许在命令行中定义符号。用于启动编译过程 例如:当我们根据同一个源文件要编译出一个程序的不同版本(假定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外的机器内存大些,我们需要一个数组能够大些)便于修改#define 100 ARRAY_SIZE//预处理时会替换成100int main()int i = 0;for(i = 0;

2024-08-30 20:05:33 537

原创 预处理详解

C语言设置了一些预定义符号,可以直接使用,并在预处理期间处理__FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义//基本语法:举例:#define reg register //为 register这个关键字,创建一个简短的名字;) //用更形象的符号来替换一种实现case //在写case语句的时候自动把 break写上。

2024-08-29 21:23:29 698

原创 编译和链接

在ANSI C的任何一种实现中,存在两个不同的环境。

2024-08-29 20:57:49 849

原创 文件操作(二)

如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等),缓冲区的大小根据C编译系统决定的。因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。”处理的数据文件的,缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

2024-08-23 23:16:08 343

原创 文件操作

磁盘(硬盘)上的文件在程序设计中,文件一般分两种:程序文件、数据文件(从文件功能的角度来分类)

2024-08-23 23:00:15 1007

原创 动态内存管理

C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员int i;int a[0];//柔性数组成员//int a[];//编译器会报错无法编译可以改成a[]}type_a;栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。

2024-08-22 22:46:03 1001

原创 自定义类型:联合和枚举

enum Day , enum Sex , enum Color 都是枚举类型,{ }中的内容是枚举类型的可能取值,也叫枚举常量。把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,一定程度上节省了内存。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。代码1输出的三个地址一模一样,代码2的输出,我们发现将i的第4个字节的内容修改为55。每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。

2024-08-22 22:05:17 409

原创 结构体详解

目录1. 结构体类型1)结构的声明2)结构体变量的创建和初始化3)匿名对象4)结构的自引用2. 结构体内存对齐1)对齐规则2)内存对齐的作用3)修改默认对齐数3. 结构体传参4. 结构体实现位段1)位段2)位段的内存分配3)位段的跨平台问题4)位段的应用5)位段使用的注意事项 在声明结构的时候,可以不完全的声明 在结构体自引用使用的过程中,夹杂了typedef 对匿名结构体类型重命名,也容易引入问题,看看下面的代码: 1. 平台原因 (移植原因):不是

2024-08-21 23:36:37 802

原创 数据在内存中的存储

超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容保存在内存的低地址处小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容保存在内存的高地址处。

2024-08-21 23:06:45 1435

原创 C语言内存函数

和 memcpy 函数的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠,如果源空间和目标空间出现重叠,可以使用 memmove 函数处理。

2024-08-20 22:58:24 346

原创 字符函数和字符串函数

比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样就提前结束,大的字符所在的字符串大于另外一个,如果num个字符都相等,就是相等返回0。islower 是能够判断参数部分的 c 是否是小写字母,通过返回值来说明是否是小写字母,如果是小写字母就返回非 0 的整数,如果不是小写字母,则返回 0。的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中。

2024-08-20 22:40:05 1020

原创 指针详解(六)

strlen 函数的参数 str 中首地址开始向后寻找,统计 \0 之前字符串中字符的个数strlen 函数会一直向后寻找 \0 字符,直到找到为止,所以可能存在越界查找。

2024-08-19 23:42:11 526

原创 指针详解(五)

函数的指针(地址)作为参数传递给另一个函数后,当这个指针被用来调用其所指向的函数时,并且不是由该函数直接调用,而是在特定的事件或条件发生时间接调用。

2024-08-19 22:29:57 198

原创 指针详解(四)

目录1. 字符指针变量2. 数组指针变量3. 数组指针变初始化4. 二维数组传参的本质5. 函数指针变量1)函数指针变量的创建2)函数指针变量的使用3)代码解析6. typedef关键字7. 函数指针数组8. 转移表代码const char* pstr = "hello bit."; 不是把字符串 hello bit 放到字符指针 pstr 里,而是把字符串hello bit.的首字符的地址放到了pstr中我们通过一道例题加深理解 所以数组指针变量:存放的应该是数组的地址,能够指向数组的指针变

2024-08-18 23:25:39 1102

原创 指针详解(三)

一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

2024-08-18 22:19:28 606

原创 指针详解(二)

assert() 的缺点是引入了额外的检查,增加了程序的运行时间,一般我们可以在 Debug 中使用,在Release 版本中选择禁用 assert 就行,在 VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了。我们发现其实没产生交换的效果,通过调试我们发现在main函数内部,创建了a和b,a的地址是0x00cffdd0,b的地址是0x00cffdc4,在调用Swap1函数时,将a和b传递给了Swap1函数,在。然后,重新编译程序,编译器就会禁用文件中所有的assert() 语句。

2024-08-17 22:56:34 755

原创 指针详解

a取出的是a所占4个字节中地址较小的字节的地址,虽然整型变量占用4个字节,我们只要知道了第一个字节地址,访问到4个字节的数据也是可行的。同理64位机器,假设有64根地址线,一个地址就是64个二进制位组成的二进制序列,存储起来就需要8个字节的空间,指针变的大小就是8个字节。拿到的地址是一个数值,比如:0x006FFD70,这个数值有时候也是需要存储起来,方便后期再使用的,那我们把这样的地址值存放。:指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。

2024-08-17 22:13:07 618

原创 操作符详解(二)

/代码1:变量的定义int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//代码2:初始化。struct Stu //类型声明//名字int age;//年龄//初始化//指定顺序初始化//代码3int data;//结构体嵌套初始化//结构体嵌套初始化。

2024-08-16 22:59:28 977

原创 操作符详解

赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=16进制的数字每一位是0~9,a ~f 的,0~9 , a ~f的数字,各自写成2进制,最多有4个2进制位。8进制的数字每一位是0~7的,0~7的数字,各自写成2进制,最多有3个2进制位。、++、--、&、*、+、-、~ 、sizeof、(类型)关系操作符: > 、>= 、< 、<= 、 == 、!2进制、8进制、10进制、16进制(数值的不同表示形式)算术操作符: + 、- 、* 、/ 、%

2024-08-16 22:21:14 1025

原创 函数递归

1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4然后继续对123%10,就得到了3,再除10去掉3,以此类推不断的%10 和\10 操作,直到1234的每一位都得到,但是这里有个问题就是得到的数字顺序是倒着的。事实上,我们看到的许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更加清晰,但是这些问题的迭代实现往往比递归实现效率更高。所以如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出(stack overflow)的问题。

2024-08-15 23:03:55 825

原创 VS调试技巧

bug本意是“昆虫”或“虫子”,现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞“Bug” 的创始人格蕾丝·赫柏(Grace Murray Hopper),她是一位为美国海军工作的电脑专家,1947年9月9日,格蕾丝·赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术人员正在进行整机运行时,它突然停止了工作。于是他们爬上去找原因,发现这台巨大的计算机内部一组继电器的触点之间有一只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。

2024-08-15 22:28:55 1345

原创 浅试扫雷游戏(简易版)

如果存放在布置雷的数组中,这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。我们在棋盘上布置了雷,棋盘上雷的信息(1)和非雷的信息(0),假设我们排查了某一个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储并打印出来,作为排雷的重要参考信息。扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要一定的数据结构来存储这些信息,因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们首先想到的就是创建一个 9*9 的数组来存放信息。

2024-08-14 11:10:11 769

原创 初识C函数(二)

/判断一年是不是闰年int is_leap_year(int y)//函数定义return 1;//函数调用if(r == 1)printf("闰年\n");elseprintf("非闰年\n");return 0;如果函数定义在main函数之后//函数声明 如果未声明编译器会报错int main()int y = 0;//函数调用if(r == 1)printf("闰年\n");else。

2024-08-14 10:34:30 653

原创 初识C函数

ret_type fun_name(形式参数)ret_type 是函数返回类型fun_name 是函数名括号中放的是形式参数{ }括起来的是函数体ret_type 是用来表示函数计算结果的类型,有时候返回类型可以是void ,表示什么都不返回fun_name 是为了方便使用函数;就像人的名字一样,有了名字方便称呼,函数有了名字方便调用,所以函数名尽量要根据函数的功能起的有意义。函数的参数就相当于,工厂中送进去的原材料,函数的参数也可以是void ,明确表示函数没有参数。

2024-07-10 22:41:26 970 1

原创 DS1302时钟

DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片引脚名作用引脚名作用VCC2主电源CE芯片使能VCC1备用电池IO数据输入输出GND电源地SCLK串行时钟X1X232.768KHz晶振6.BCD码BCD码(),用4位二进制数来表示1位十进制数。

2024-07-10 22:12:28 382

原创 初识数组(二)

每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以二维数组中的每个元素都是连续存放的。在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小(VS2022不支持)数组arr 就是变长数组,因为它的长度取决于变量n 的值,编译器没法事先确定,只有运行时才能知道n 是多少。变长数组的根本特征,就是数组长度只有运行时才能确定,所以。

2024-07-09 21:21:32 533

原创 LED点阵屏

LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等LED点阵屏分类按颜色:单色、双色、全彩按像素:8*816*16等(大规模的LED点阵通常由很多个小点阵拼接而成)2. 显示原理LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同。

2024-07-09 20:57:45 1196

原创 串口通信&控制LED

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。51单片机内部自带UART,通用异步收发器),可实现单片机的串口通信。名称引脚定义通信方式特点UARTTXDRXD全双工、异步点对点通信I²CSCLSDA半双工、同步可挂载多个设备SPISCLKMOSIMISOCS全双工、同步。

2024-07-08 20:58:36 990

原创 初识数组(一)

数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)。C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号。我们又知道数组中所有元素的类型都是相同的,只要计算出一个元素所占字节的个数,数组的元素个数就能算出来。存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。有了下标访问操作符,我们就可以轻松的访问到数组的元素。数组是一组相同类型元素的集合。

2024-07-08 20:34:36 617

原创 分支和循环(四)

编写猜数字游戏游戏要求:1.)电脑自动生成1~100的随机数2.)玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束。

2024-07-07 22:30:37 425

原创 按键控制LED流水灯模式&定时器时钟

中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3中断优先级个数:4个中断号:注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等。

2024-07-07 22:12:47 1198

原创 分支与循环(三)

本来for 循环想提前退出得使用 break ,一个break 只能跳出一层for 循环,如果3层循环嵌套就得使用3个break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷方便。在 do while 循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,判断表达式的结果是!=0,则继续循环,执行循环语句;而 do while 循环则是先直接进入循环体,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。

2024-07-06 21:06:43 947

原创 分支与循环(二)

只有在switch 语句中使用 break 才能在跳出switch 语句,如果某一个case 语句的后边没有break 语句,代码会继续玩下执行,有可能执行其他case语句中的代码,直到遇到break 语句或者switch 语句结束。就比如上面的代码就执行了case2 中的语句。for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是for 循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优一些。

2024-07-06 20:31:48 784

原创 分支与循环

C语言是结构化的程序设计语言,这里的结构指的是,C语言是能够实现这三种结构,通过使用 if 、switch 实现分支结构,使用 for 、while 、do while 实现循环结构。

2024-07-05 21:57:23 762

原创 矩阵键盘与密码锁

为了减少I/O口的占用,通常将按键排列成矩阵形式,采用逐行或逐列的 “扫描”,就可以读出任何位置按键的状态。

2024-07-05 18:47:51 624

原创 C语言数据类型和变量(三)

1> printf( ) 不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行,为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个换行符\n。1.除了%c 以外,都会自动忽略起首的空白字符,如果要强制跳过字符前的空白字符,可以写成scanf(" %c", &ch) ,即%c 前加上一个空格,表示跳过零个或多个空白字符。占位符时,应该指定读入字符串的最长长度,即写成%[m]s ,其中的[m] 是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。

2024-07-04 21:23:51 791

原创 单片机模块化编程和LCD1602调试工具

2).h文件:可被外部调用的函数、变量的。

2024-07-04 10:16:41 726

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除