- 博客(41)
- 收藏
- 关注
原创 SQLite3数据库操作完全指南
1,sqlite3---软件的命令sql语句-------如何操作数据库2,创建一个数据库命令:创建数据库-----stu.db.databases------查看当前数据库关联的文件名3,数据库操作.table 查看数据库的名.schema 查看表的结构4,插入数据insert into 表名 valus(数据名,数据名)select from*stu 查询列表信息:.headers on 打开表头.mode colum 一固定的列宽呈现步骤展示:创建数据库:升降序展示列表:增加列:修改列:删除:事务
2026-03-16 13:02:16
43
原创 HTTP通信与多线程服务器实战
通过ping 获得地址IP,可以访问到他http 通信过程:1,建立连接2,http-----按照他的协议进行收和发。(1)请求报文(2)响应报文注,URL 统一资源定位符。
2026-03-13 22:44:26
400
原创 网络通信全解析:从物理层到应用层
1,物理通路光纤卫星2,逻辑通路 ----- 软件层面3,想要实现获取地址 网络和主机进程IP地址 = 网络号 + 主机号IP表示的方式:IP地址的本质------实际是4个字节IP地址分类:ABCDEIPV6 ---------128位的地址 地址足够大,IPV4---------32位的地址每个字节的取值范围是0 到255;需要经过网关:一般都是路由器判断是不是本局域网的。DHCP:分配地址DNS:使得地址方便人使用。
2026-03-07 23:09:25
339
原创 进程通信:管道与信号实战解析
本质:共享了 内核空间管道:1,无名管道2,有名管道:基本使用流程:建立管道 ------通过管道读写。头文件:‘‘unistd’ 创建一条管道:int pipe(pipefp[2]);int fd[2];int ret = pipe(fd[);数组关联管道的两端:1,pipefp[0]; 读端 ------文件描述符(在内核中-----看作文件)最小从3和4开始-----012已被系统标准输入使用。2,pipefp[1]; 写端---------同上父进程 写数据子进程 打印数据 释放了不需要
2026-03-06 00:01:24
262
原创 进程学习的总结大纲
include <stdio.h> // 标准输入输出(printf/perror)#include <signal.h> // kill/signal(信号相关)父进程等待子进程结束,并收回:waitpid(pid,&status,0/用宏来解析 &status(复合信息的 “二进制数据包”)参数。阻塞状态时:父进程在等待的过程中可能产生僵尸进程。
2026-03-03 23:08:48
258
原创 线程:高效并发的秘密
轻量级的进程:重量级的进程:对比:所占资源的大小:创建 进程 :PCB + 堆栈 bss data text创建 线程:线程ID + 程序计数器|寄存器集合|栈淘宝:双11一瞬间千万人 操作,用户规模单位时间创建更多进程,创建的效率(空间和时间)。复制进程————减少复制次数。一般直接fork( )后来:父子进程共享线程(工人)--------进程(车间) ------多任务(干活)有了线程:1,线程:CPU调度的最小单位 (侧重于执行)(多线程共享进程的代码)
2026-03-03 18:58:49
354
原创 揭秘进程生命周期:从fork到exit全解析
子进程和父进程:各自拥有独立的运行空间。函数 stat :函数的使用:获得文件长度指令 vi 1.c 2.c -d // 对比两个文件是否相同fork( ):进程的执行:1,做独立的事情;2,做和父进程类似的事情。
2026-03-02 20:35:56
277
原创 C语言文件IO操作完全指南
O_TRUNC 文件存在 且是 普通文件 并且可以写 ,则截断为0(清除文件)如果有 O_CREAT的标志,需要用到mode 参数。失败:-1 && errno会被设置。注: ret 表示读取文件的字节数。练习:创建和原文件一样大小的空文件。文件的权限确定 --- 最终确定。O_CREAT 文件不存在创建。3.关闭 -- close。2.读写 -- read。1.打开 --open。O_RDONLY 只读。O_WRONLY 只写。O_APPEND 追加。成功:返回新的文件描述。
2026-02-27 19:30:44
319
原创 Linux文件编程2
在读取的时候'\n' 和程序显示的\n 不是一种。每打开一个文件,内核会维护一张打开了的文件信息表。应用-----文件中的数据格式相对固定。读和写操作,会影响一个文件的偏移量。注意:输出是不会输出 \0.结构体中一次读取一个名字。练习 求一个文件的行数;
2026-02-26 20:54:06
69
原创 Linux文件编程:流与操作全解析
cp shuru.c txt2.c 复制源文件到目标文件中。FILE * //流指针 文件指针 代表打开了的某个文件。失败 NULL & errno 会被设置。可以根据errno打印对应的错误信息。perror(“自定义的信息”);Linux系统对于文件?实际上是个宏 相当于-1;名字-摘要-描述-返回值;成功 FILE * 流指针。Linux系统的结构。自定义信息:错误原因。
2026-02-25 20:55:01
417
原创 树结构的认识
3,完全二叉树,对于一颗有n个结点的二叉树按层序编号,如果编号i(1<=i<=n)的结点于同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这可树为完全二叉树。n个结点的有限集合,集合要么为空树,要么由一个根结点和两棵互不相交,分别称谓根结点的左子树和右子树的二叉树组成。中序,左根右,先从根开始(不是先访问根),从左开始访问,在访问根,在访问右结点。1,斜树,所有的结点都只有左子树,左斜树,所有结点都只有右子树,右树。n = 0 ,空树。树的度数是指,这棵树中,最大的结点的度数,称谓树的度数。
2026-02-11 17:40:32
293
原创 队列数据结构:先进先出的速度缓冲器
缓冲,速度不匹配(队列是只允许在一段进行插入,而在另一端进行删除操作的线性表。允许插入的称谓队尾,允许删除的一端队头。顺序队列。循环队列,常用操作,入队,出队。(先进先出)
2026-02-11 14:14:13
54
原创 深入解析栈结构及其应用
实现简单,只需要数组和一个 top 指针,适合对空间和效率要求较高的场景。- 入栈、出栈、判空、判满的时间复杂度都是O(1),操作简单高效。- 不需要扩容,也没有空间浪费,但每个节点会多占用指针域的内存。满栈 :top指示器,指向的地址,是最后一次栈元素的地址。空栈 :top指示器,指向的地址,是新元素待插入的地址。增栈,当元素入栈后,top指示器,表示地址,是慢慢增大。减栈,当元素入栈后,top指示器,表示地址,是慢慢减小。引用:1,字符串的解析 2,回溯,递归,优先级。
2026-02-10 23:31:51
560
原创 数据结构三个典型的类型整理
链表是逻辑结构连续物理结构(在内存中的表现形式)不连续。链表, 不需要预先分配,大小可变,动态分配。顺序表 需要预先分配空间,大小固定。顺序表是一段连续的存储单元。顺序表和链表 优缺点。查找 顺序表O(1)
2026-02-09 23:29:54
83
原创 链表高效动态存储的奥秘
使用make 命令后,会在当前目录下查找 Makefile 或(makefile) .并执行Makefile中的编译规则,为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,除了存储其本身的。,线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以。把存储元素信息的域叫数据域,把存储直接后继位置的域叫指。make clean 执行Makefile 的中,目标名为clean这条规则。动态存储,程序运行起来后,决定链表的容量。
2026-02-08 22:54:33
243
原创 数据结构与算法精要解析
当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令表示一个或多个操作。如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有。2,有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。3,健壮性,输入非法数据,能进行相应的处理,而不是产生异常。1,输入,输出特性,输入时可选的,输出时必须的。3,确定性,同一个输入,会得到唯一的输出。4,可行性,每一个步骤都是可以实现的。
2026-02-06 23:22:03
685
原创 C语言结构体与共用体详解
1,结构体的定义2,定义结构体的变量int a;struct 结构体名 变量名;5.结构体的存储大小:字节对齐(4个字节),不够补字节;由于结构体是自定义类型,成员变量,根据需要来定义,CPU在放问数据的时候,都是4个字节的读,效率高,自己定义的成员变量相对地址偏移量,不一定在4字节的位置上,所以编译器就会帮你把成员变量的地址扩展到4字节的位置上,因此结构体会变大。1,结构体成员必须存放在内存地址为自身类型大小的整数倍的内存地址。
2026-02-03 21:09:28
327
原创 揭秘void*万能指针的妙用
对一维数组&操作:&a[0],&a(不能看作二级指针,特殊),a地址不变,&a,数组指针,表示一整个一维数组。·对数组指针指行 * 操作,*&a, 地址不变(&[0]),*&a ==a;sizeof(int*) =8 sizeof(int[]) = sizeof(int)*元素个数。· 其他任意类型指针给 void *赋值,或者参数传递,直接复制或转换参数就可以了。·当需要把void* 转换成其他类型的时候,需要强制转换类型,后才可以使用。void * 作为函数参数的时候,可以接受任意类型的指针。
2026-02-02 17:38:04
321
原创 C指针与数组的深度解析
作为函数的设计者,希望以更多的规则方式显示,需要更多的主调者,传入规则函数。函数指针,本身是一个指针,存储某一个函数的地址。函数名,本质是一个指针,存储了一个地址,指向代码段中的对数据操作的代码。在函数体内部修改外部指针,在函数调用的地址传递中,需要改变本身,可以使用二级指针,改变内容,一级指针即可。2,函数传递参数的过程中, char** (指针),char*[ ](指针二维数组),兼容类型。当数组定义好后,数组名是一个地址符号,和开辟内存空间的编号终生绑定,自身不能再改变。定义,指向指针变量的指针。
2026-01-31 17:45:50
327
原创 指针的使用
从指针存储地址开始,往后(地址变大的方向)移动 单个该类型(char ->1 double --> 8 float->4 int-> 4)所占的字节大小。形参会接收到实参传递的地址,,就可以在背调函数的内存,通过间接访问的方式,通过修改形参,进而修改实参。· 指针在使用的时候,有两个概念,一个是指针变量本身,一个是指针指向的内容。3,指针:指针是为了更加高效的访问(访问的是谁的地址,是不是野指针)。:当指向的是同一数组的时候,有意义,结果是两地址之间的元素个数。
2026-01-29 17:30:02
59
原创 预处理指令
include "2.h" gcc在 查找头文件的路径,生产a.out的路径,如果没有,回去系统头文件目录中查找,如果没找到就报错。3,汇编 gcc -c 1.c -o 1.o 把汇编文件,编译成 object (目标文件,已经2进制,不可执行)包含头文件,把被包含的头文件内容,复制一份到 #include 的这个地方。·宏定义本质是代码的替换,中间的过程不进行任何的数据计算。· 没有函数调用的开销,(栈空间会保留函数返回的地址),··预处理的过程中,是代码的替换。函数,会有参数的传递。
2026-01-28 10:35:59
331
原创 函数计划2
递归函数需要设置结束条件。如果没有终止条件的话,栈区会被耗尽,程旭就会崩溃。(栈区粉碎),每次函数在被调用的时候,都会开。递归操作,可以替换循环。但是循环不能替换递归。辟一段内存空间(栈),最少也要保留返回地址。定义:函数在函数体内部调用自己的操作。斐波那契数列:所求数前两个数之和。应用:需要回溯问题。递归相对循环来说,开销大。
2026-01-27 14:03:35
119
原创 函数基础学习
表达式的值先用后加,变量的值会产生一个临时变量,把num++之前的值保存下来)。· 在传递数组过程中如果使用只传递,那么背调函数中也需要创建一样大的数组,有的时候数组会很大,那木在结束后这段空间会被回收。// 返回, 返回主调的地方(当时fun函数在那个地方被调用的)。2,在背调函数定义中,只需要数组名,不需要长度,因为字符串有结束标志'\0';在函数调用传参中,如果是传递的是数组,传递方式就是地址传递。· 在被调函数中,是可以修改形参,来修改主调中的实参。1,实参的个数和形参的个数相同。
2026-01-26 17:16:20
208
原创 嵌入式学习计划9
1,数组的倒置注意:(逆序反转时(本质是成对交换),循环的终止条件为(len/2),以确保每个元素只交换一次,当数组长度为奇数的时候,中间的元素不需要交换,逻辑依然成立)。练习12.冒泡排序(相邻元素的比较)排序,把一个数组按照特性规则(默认从小到大)进行排列位置的操作,排序升序,从小到大降序,从大到小(1),每次都会找到一个最大值,目的,查找定位。一个最大值,并存储到最后面。(2),依次比较,相邻元素。(内层循环)for(j = len-1 ; j>0 ;j-- ){ for(i = 0;i<j;
2026-01-22 18:20:20
376
原创 嵌入式学习计划8
把数字的所有元素,依次访问,有且只有一个词访问,一般需要配合循环使用(读写变量)。元素个数——》常量或常量表达式,不能是变量或变量表达式(GNU gcc 是允许的)下标,可以是常量,变量,表达式,(在使用数据的时候,下标不能越界)数组名·-》标识符, 字母,数组,—— ,不能数字开头。数组元素被访问的时候,下标值是从0开始,到元素的个数-1。2,一般在出错处理中使用,内核编程-操作系统级别编程。3,如果为真,再次运行循环体,反之,结束循环。1,在应用程序中,禁止使用goto。循环体至少运行一次。
2026-01-21 17:15:48
311
原创 嵌入式学习计划7
表达式3) // 表达式1 ,初始化(控制变量,也可以有其他的初始化) 表达式2 ,控。如果表达是1,2 为假,就判断表达式3 ,如果为真,执行语句块3. 语句块3 执行完,整个if 结束。如果表达是1 为假,就判断表达式2 ,如果为真,执行语句块2. 语句块2 执行完,整个if 结束。表达式,关系表达式,逻辑表达式。3. if,或者else 后,都使用大括号,包含代码(空语句,一条语句,多条语句)。while(表达式) 表达式(关系,逻辑)的值, 真,假 , 类型 int i<10。
2026-01-20 18:27:19
166
原创 嵌入式基础的自学计划5
接收多个数据时,空格、回车、Tab 都会作为分隔符,例如 scanf("%d%d", &num1, &num2) 可以通过输入 10 20 或分两行输入来完成。- scanf("%s", s):读取字符串时,会在遇到空格、回车或 Tab 时停止,因此无法接收包含空格的字符串。- 技巧:在等值比较时,建议把常量写在左边,例如 if(10 == a) ,这样可以避免误把 == 写成赋值运算符 =。%s :输出字符串。- 先计算 表达式1 ,若结果为真,整个表达式的值为 表达式2;
2026-01-19 18:29:58
242
原创 嵌入式学习计划5
c,表示需要输出的字符,可以是常量,变量,表达式。需要注意的是,c的数据类型必须是int ,或匹配。以计算机中的内存为参考点, 如果数据从内存中取出的这种操作,输出。format ,输入一个模板.scanf 会严格匹配模板.如果匹配失败,那么,接收就会失败。%0nd -> %5d, 指定显式的域宽(占5个字符的位置) ,默认右对齐, 空白位置补0。%nd -> %5d, 指定显式的域宽(占5个字符的位置) ,默认右对齐。%-nd -> %-5d ,指定显式的域宽(占5个字符的位置) ,左对齐。
2026-01-17 22:33:17
313
原创 嵌入式基础学习C语言篇
算术运算符(+,-,*,/,%) > 移位运算符(左移,右移) >关系运算符 (>,< ==,) > 位运算 (二进制位,与, 或,// int == c 如果c(1byte) 中数据是一个负数的话(-100),num(4byte),扩展。(需要转换的类型) 常量 (double)5 -> 转换完后,这个位置,会产生一个中间临时变量,他的结果是。把内存空间小的往内存空间大的赋值,高位补充,(1)原来数据是无符号 ,高位补0 , 如果是负数。//这个叫初始化,定义变量的时候,会开辟内存,第一次装入的值。
2026-01-16 18:03:27
334
原创 嵌入式学习计划三
不同数据类型进行运算,需要把数据类型转换一致,把低精度的数据转为高精度数据。//char 48 表示字符 '\0';3. 变量名的组成:数字、字母、下划线(区分大小写,不能数字开头)4. 变量变化的原因:变量定义时,会给变量分配对应内存空间。//表示ASCII表中的8进制数,表示字符3。//开辟空间,num1内存中为随机值。//初始化:定义变量时,给初值。- C语言中,如果相同数据类型运算得到结果为该类型;//0x,表示的是十六进制。- - - / %(求余)++ --//前导0,表示八进制。
2026-01-15 19:11:34
130
原创 嵌入式基础学习计划2
进制转换(除2取余):10/2=5余0,5/2=2余1,2/2=1余0,1/2=0余1,倒序得0110(笔记写01110)(笔记计算式2¹⁶+2¹⁰= )char = signed char:1byte,范围-127~127(笔记写-172~171,疑似笔误),区分大小写。char:占1字节,ASCII表(A65、a97)、mal(疑似笔误,应为mal?(笔记疑似笔误,实际1KB=1024字节),1KB=1024字节(用于文件大小)十六进制:0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f。
2026-01-14 18:16:59
250
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅