自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 I2C总线

要求:所有的I2C设备的SCL连在一起,SDA连在一起;设备的SCL和SDA均要配置成开漏输出模式;SCL和SDA各添加一个上拉电阻;开漏输出和上拉电阻的共同作用实现了“线与” 的功能,此设计主要是为了解决多机通信互相干扰的问题上拉电阻模型,开关断开输出1,开关闭合输出0,因此高电平驱动能力弱,低电平驱动能力强开漏输出模型,开关断开时,电压不稳定,为悬空输出起始时序:SCL高电平期间,SDA从高电平切换到低电平终止时序:SCL高电平期间,SDA从低电平切换到高电平。

2024-04-08 17:14:32 193

原创 快排,归并,堆排浅析

快排的关键思想是如何划分当划分后,划分值的左边都是小于等于此值,划分值的右边都是大于此值。然后分别对左边和右边进行递归,直至递归到快排函数中的数只有一位,结束递归,执行后续。一般的划分思想就是取第一位的值为划分值,然后使用两个指针i ,j 把 i 的值作为第一位的下标,把 j 的值作为最后一位的下标。当 j 下标对应的值大于划分值就把j-- 否则,把把 j 下标的值赋值给i 下标,然后同样的方式看 i 下标。当i ,j下标相等时退出。最后把划分值给i 或 j 下标就行了。

2023-12-23 20:30:46 865 1

原创 查找数组中第k位元素

可以采用分治策略来实现。

2023-12-19 19:00:40 360

原创 栈的以及链栈实现

【代码】栈的以及链栈实现。

2023-12-14 16:28:30 51

原创 带头节点的链表的各种代码

【代码】代表头的链表的各种代码。

2023-12-13 15:55:08 41

原创 c语言学习笔记(函数指针)

在程序中定义了一个函数,当编译链接成功,运行程序时,系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址成为这个函数的地址。int (*pfa) (int a , int b) 函数指针变量,pfa是一个指针,4字节,要存放的是函数地址,什么样的函数呢?int * (*pfb)(int a ,int b) 这个是一个函数指针变量,和上面的差不多只不过存放的函数的指针其返回类型是整型指针类型。int * fun(int a , int b) 返回类型是一个整型变量的地址。

2023-12-11 23:29:54 17

原创 c语言学习笔记(二维数组)

一个二维数组,在本质上是由多个一维数组构成的(每个一维数组大小必须相同),如定义 int ar[3][4] ,它是由三个一维数组组成,每个一维数组的大小是4个整型元素。s是二维数组,存放的是dx[1]的首地址,也就是指向3的地址,而s[1][3] 可以表示为:*(*(s+1)+3)p存放的是dx[1]的地址,而p是一级指针,p加3就相当于向下偏移3位,因此就是指到了6。s + 1表示指到dx[2]首地址,然后再加上3,指向了8的地址。这里的p + 1 加的是一维数组大小,也就是16字节。

2023-12-05 23:18:19 52

原创 c语言学习笔记(二级指针)

遇到括号先解释括号里面的,再解释括号外的,首先s是指针变量,开辟四字节,能存放数组地址,这个数组开辟4个空间,每个空间都是整型。*s + 1 加的是a0 ,a1 等类型的大小,如果是int型那么加的就是4,double型加的就是8。s存放的是p1的地址,*s就是p1本身,p1存放的是a的地址,*p1就是a本身,因此**s就是a本身。而后面的s与*结合,说明s是指针,指向的是数组的地址,这个数组空间是4,每个元素为整型。如果int ** s 中放的是ar0 的首地址,那么s + 1能不能指向ar1呢?

2023-12-01 23:08:44 98

原创 c语言学习笔记(格式化字符串)

sprintf可以返回字符个数,int len = sprintf(buff," a = %d b = %d\n",a , b);那么这里len就为15(上面存放的是15个)此时num的值为2,执行的结果是a = 12,b = 23。如果为12.23,那么num就为1,就只有a有数据为12。%2.2f 告诉编译器,整型有两位,小数位有两个。spritf 打印格式化输出到缓冲区。那么是如何存放的呢?

2023-11-30 22:58:37 37

原创 c语言学习笔记(void类型)

无类型不能定义变量但是可以定义无类型指针变量void * vp = NULL;可以指向任何类型的地址,但是不能解引用。但是void类型解析并不知道按什么类型解析,因此无类型不能解析,不过可以通过强转来实现类型转换。int * ip 解引用时解析4字节。char * cp 解引用时解析1字节。double * dp 解引用时解析8字节。当函数不需要接收参数时,必须使用void限定。当函数不需要返回值时,必须使用void修饰。

2023-11-28 22:41:55 25

原创 c语言学习笔记(string.h)

例如:stra[] 为{"a b c d e"};strb为{"a b x"};函数形式:char strrchr(const char * str ,char ch)比较两个可能有 \0 的数组,最多比较count个字符,相当于上面的加强版。字典序x在c后面,因此strb小,返回一个负值,否则返回正值。寻找ch在所指向的空终止字符串中的首次出现位置。把两个字符串连起来(把后面的链接到前面的)

2023-11-27 23:06:26 28

原创 c语言学习笔记(指针)

因为在数组作为函数的形参时,数组名退化为指针,无论形参为int br[] , int br[5] ,最终都会退化为int *br,也就是此时br为指针类型,但此时就会丢失数组的另一个特征大小,因此我们需要多定义一个形参。时ip中存放的是&a但是虽然fun()函数空间释放,a空间不在但由于没有值覆盖,因此&a仍然能够指向残存的a,因此输出的结果*ip 为100。当为char类型的指针时,解引用到首地址对应的位置时,只解析一个,而当为int类型时,会向下解析三个位置。

2023-11-22 17:57:18 46

原创 c语言学习笔记(指针数组)

if(month > 2 && IsLeap(year)) 与if(IsLeap(year) && month > 2) 运行结果一样,但是前面是只有month > 2 才能运行后面,因此比后面的那个运行更快。定义大小为100的整型数组,使用随机函数给数组元素赋值,数值范围在1-100,并且排序,使用冒泡排序实现。查表法:将一些事先计算好的结果,存储在数组中用到时直接按下标取数据,以节省运行时间,以空间换时间。看优先级(),和[] 的优先级为1,而*的优先级为2,因此谁先于变量结合,就是什么。

2023-11-17 19:45:51 19

原创 c语言学习笔记(数组)

/ 会报错,为什么呢,因为数值是在编译时就确定它的大小,在运行时,数组已经开辟了具有多少空间而局部变量在编译时n不存在,只有在运行过程中,我们才能给n开辟空间并把值赋给n。由于strlen是以\0作为结尾标志,因此,当结尾出现\0时才会结束,但而sizeof是看开辟了多少空间,因此sizeof(strd) = 5;凡是用花括号初始化,未填充的空间统统填的是0,凡是以\0(ASCII值为0)结尾的通通认为是字符串,因此,stra,strb是字符串。每个类型相差4字节,一个整型的字节,连续存放!

2023-11-17 18:39:04 19

原创 c语言学习笔记(逗号表达式)

为什么输出的是8 呢?因为逗号的优先级最低,要低于赋值语句,因此,x = 8也就是3+5。因为逗号表达式的值为,最右边表达式的值,所以x的值为15。

2023-11-14 23:27:21 42

原创 c语言学习笔记(随机种子)

例子:随机生成一个1-100之间的数,猜对了就继续游戏,猜错了就给提示大了还是小了,最终提示猜对所用的次数。但是这个随机数是一个伪随机数,也就是第一次启动和第二次启动生成的是同一个随机数。输入年月日,找出最靠前的时间,当输入的年月日,小于等于0时,结束程序。, 需要在#include<time.h>头文件中,意思是。这样就可以每次调用都是不同的随机值。所以我们需要一个随即因子,

2023-11-14 23:20:47 272

原创 c语言学习笔记(跳转语句)

break 语句只能在switch语句和循环语句中,用来跳出switch语句或提前终止循环,转去执行switch 语句或者循环语句之后的语句。goto 语句和标号语句一起使用,标号语句就是用标识符标识的语句,他控制程序从goto 语句所在的地方转移到标号语句处。而for循环中嵌套switch, 用continue时会直接跳到 i++ ,而不执行switch后续语句。return 语句用于结束函数的执行返回调用者,如果只是主函数,则返回至操作系统。

2023-11-13 23:18:21 293

原创 c语言学习笔记(函数详解)

/这个函数的调用是错的,不应该加int ,正确写法:z = Add_Int(x ,y);因为当月份输入是18时,显示为0,但实际上并没有18月,因此要对函数的合法性进行检测,怎么改呢?int Add_Int(int a , int b) //这个是函数的定义,不加分号。意思就是如果天数小于1或者天数大于上面函数输入年月后得到的天数时,就会返回天数错误。//这个是函数的声明。把实参给形参是从右想左赋值,也就是先把y的值赋给b,再把x的值赋给a。

2023-11-08 21:33:37 68 1

原创 c语言学习笔记(分支语句)

可以把上面的 if ( ch >= '0' && ch

2023-11-07 23:22:19 35 1

原创 c语言学习笔记(关系运算符)

/ 从左向右结合,因此a < b 为真,故a < b 就为1 ,变成了 1 < 3 , 为真 ,故x的值为1。b == c || d < a 等价于((!b) == c) || (d < a)a + b > c && x + y < b 等价于((a+b) > c ) && ((x+y) < b)a > b && c > d 等价于(a > b)&&(c > d)|| 或运算 有1就是1,全0才为0。|| 也被称为截断或。

2023-11-07 13:07:35 40 1

原创 c语言学习笔记(bool类型)

bool类型只有true和false两种类型 0是false 非0是true。1 在c中引入#include ,在c++中不需要加。bool类型1字节(1存储单元)定义bool类型的两种方案。直接整第一种就完事了。这个是想要为真时打印。这个是想要为假时打印。

2023-11-06 23:01:54 221

原创 c语言学习笔记(register关键字)

1 register变量必须是能被cpu所接受的类型(这个变量一般是单个值,且长度小于或等于整型的长度,有些寄存器不能放浮点数)register :这个关键字建议编译器尽可能的将变量存在cpu内部寄存器中而不是通过内存寻址访问以提高效率。3 只有局部变量和形式参数可以作为寄存器变量,全局变量不行(因为会一直占着寄存器,局部变量用完就释放了)5 寄存器数量有限,不能定义多个,并且起不起作用看编译器(因为只是建议)2 register 变量可能不存放在内存中,所以不能用&来取地址。

2023-11-01 23:34:26 53 1

原创 c语言学习笔记(const关键字)

2 const定义的是变量,而define定义的是常量。但const定义的常变量本质上仍是一个变量,具有变量的基本属性,有类型,占用存储单元。1 #define 是预编译指令,而const是普通变量的定义,#define定义的宏是在预处理阶段展开的而const定义的只读变量是在编译运行阶段使用的。3 const定义的对象有数据类型,而宏定义的对象没有数据类型,因为无安全检查,就很容易出现“边际问题”或者说“括号问题”const是定义只读变量的关键字,或者说是定义场变量的关键字(只读,不写)

2023-11-01 23:18:31 46 1

原创 c语言学习笔记(static)

静态局部变量:当函数第一次被调用时,函数中的静态局部变量被初始化,再次调用这个函数,这个static变量也不会再次被初始化,仍是保存的前一次函数调用时的结果(作用域不变,生存期改变)i < n时,会调动fun函数,给fun函数也分配栈帧,当打印完a,b后又会回到主函数,给fun函数分配的栈帧会回收,a,b就相当于还给系统了。从主函数执行时,不会把栈全部分给主函数,而是把栈的一部分给主函数,这一部分空间大小就称为栈帧。重新循环,调用fun函数,又会分配栈帧,然后重复这样。,而加static后。

2023-10-31 23:04:55 31 1

原创 c语言学习笔记(extern关键字)

如果想要在hello.c中用text.c中定义的g_max和函数void fun() 就要加extern。如果只有一个文件这个extern 关键字没啥用,因为把全局变量放到前面就可以了,但是如有多个项目就有用了。extern 用在全局变量或者局部变量的声明前,用来说明此变量/函数是在别处定义的,要在此处引用。声明和定义的主要区别就是:定义创建了对象并为这块对象开辟了一块内存,而声明不分配内存。什么是定义:就是为这个变量分配一块内存并给它取上一个名字,这个名字就是变量名。,就要加上extern 关键字。

2023-10-25 23:06:52 26 1

原创 c语言学习笔记(typedef)

typedef :是在c语言允许为一个数据类型起一个新的别名。宏替换#define 和 typedef 的区别。当struct 与 typedef 结合使用时。就相当于 u_int8 x1;

2023-10-24 20:18:25 46

原创 c语言学习笔记(关键字)

a是整形,++a什么的,sizeof(++a) 还是4相当于 x = 4。sizeof: 计算类型的大小或变量的大小,也就是字节个数。关键字:已被c语言本身使用,不能用作其他用途使用的字。计算后的值为无符号整型 unsighed int;

2023-10-24 19:40:57 30

原创 c语言学习笔记(缓冲区)

因为具有缓冲区的原因,当你输入12 按下回车,就是\n 此时\n 会存放在缓冲区里面,因此ch就从\n继续读,\n 的ASCII 值为10 ,而y/Y并不是,因此会直接结束。缓冲区:指在程序执行时,所提供的一块存储空间(在内存中),可用来暂时存放做准备执行的数据。stdin 标准输入文件一般指键盘,scanf() 、getchar() 等函数从stdin 获取输入。当你输入12 按下回车时询问你是否继续,但是你想继续按y接着输入,已经给出了结果,为什么呢?但缓冲区也有缺点,看下例。

2023-10-19 23:39:43 28

原创 c语言学习笔记(结构体)

结构体(一种数据类型):程序开发人员可以使用结构体来封装一些属性,设计出一种新的类型,再c语言中,称为结构体变量。//无论是什么指针,在32位系统中都是4字节。因为*的优先级低于. (*优先级是2, .的优先级是1)sp => &stud;sp存放的是结构体的地址。*sp就是stud本身。指针变量访问结构体成员用-> 或者().那能不能*sp.s_id 呢?而(*sp).s_id 就可以了。sp-> s_id也可以。

2023-10-15 21:36:02 27 1

原创 c语言学习笔记(指针基础)

当我们的程序进行编译,链接之后会生成一个可执行文件,这个可执行文件是储存在硬盘中的,在磁盘中的可执行文件不能运行,要想运行必须加载到主存储器中,包括可执行文件的代码,数据等都要放在主存储器中(实际上就是内存).cpu就会从内存中取得当前可执行文件的代码和数据.不可执行文件也必须从磁盘中加载到内存中。*p => a 可以把*p认为是a本身,又因为a = 10,所以*p取值取的是a的值,所以*p取的是10。计算机的储存地址是小段储存,也就是低位数储存在低地址,高位数储存在高地址。

2023-09-03 21:36:18 36

原创 c语言学习笔记(%取余)

首先要打印26行26列,每一行有26个数组,数组是从0开始计算,所以最后一位是25,第一行从0位开始打印,打印26个数,第二行从第1位开始打印,就这样一直打印到最后一个数,再从第0位开始继续打印,就这样一直打印26行。4.求最大公约数:求最大公约数的最常用方法是欧几里得算法(辗转相除法)其计算原理依赖于定理gcd(a , b) = gcd (b , a mod b)如果%左边的操作数是正数,则取余的结果为正数或者0,如果%左边的操作数为负数,则取余的结果为负数或者0。=的优先级只比,高,比?

2023-09-03 16:46:34 692

原创 c语言学习笔记(运算符)

自增1后,把11回写给a,此时a的值变成了11,再接着把a的值赋给x。这些运算符也叫做赋值运算符,除此之外,>>=、

2023-09-03 14:42:20 54

原创 c语言学习笔记(作用域和生存期)

在链接后形成可执行文件,可执行文件并不是在执行,它只是以文件的形式在磁盘(硬盘)里面,当双击之后就会开始执行,也就是形成了一个执行实体也就称为。生存期是指标识符(定义的全局变量或局部变量)从程序开始运行的时候被创建具有储存空间,到程序运行结束时消亡,释放储存空间的时间段。当程序开始执行时,会获得cpu的资源和内存的资源,当结束时,将会把分配的资源收回。全局变量的生存期:从函数运行前开始,到执行后结束。动态生存期:标识符由特定的函数调用或运算来创建和释放(由程序员来决定),此阶段针对的是程序的执行过程。

2023-09-03 13:34:05 53

原创 c语言学习笔记(数组)

上面这个函数当int mainhan函数放在前面时,编译会不通过,因为TriangleArea 函数的定义是放在后面的,也就是TriangleArea函数出现时,还未定义,因此编译不通过。float TriangleArea (float a, float b ,float c) 这个是函数的定义。声明不关心返回类型,函数名,而关心名称(a,b,c 写成什么字母对后面都没影响)

2023-08-31 21:09:31 30 1

原创 c语言笔记(三种循环语句)

do while 语句本质上就是while语句,只不过是先执行循环语句再判断。循环变量初始化:表达式1,循环判断:表达式2,循环体变量自增:表达式3。do{} while (条件语句)while (条件语句)

2023-08-28 18:28:57 31 1

原创 c语言学习笔记

_ _ _ 三位八进制,八进制不能超过377,每个数在0~7之间,只能有三位,超过转换范围时,就只转换前面的,例如 { " yhp\998 ok"} 都超过了范围,\就会被舍去,而{ " yhp\298 ok"}中9超过了转换范围就只能转换\2。单引号'a' 表示97开辟一个空间,双引号"a"表示不仅97开辟一个空间,同时也开辟了一个空间储存\0,就是在c语言中的字符串必须是拿\0作为结尾的。转义字符 注意大小写‘\n'是换行的意思,但是'\N'就是'N'的意思,大写时转义字符将被忽略。

2023-08-28 17:07:31 34 1

原创 c语言学习笔记

具体方法就是0 2 4 8 16 32 64 128 256 这样减来得到二进制,再用二进制计算八进制(三个二进制等于一个八进制),同理计算16进制(四个二进制等于一个16进制)其中.c/.cpp为源文件(文本文件) .h为头文件(文本文件) .i为预编译文件(文本文件) .s为汇编文件(文本文件) .o/.obj称为二进制目标文件。//(%c %d %f中间是空格,输入时就要是空格,中间是逗号输入时就要是逗号):由下划线_ 英文字母(A-Z,a-z)和数字(0-9)构成,

2023-07-17 11:17:45 64

空空如也

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

TA关注的人

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