![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
欸嘿嘿嘿
专业物联网,什么都会什么都不会
展开
-
随笔2020-10-6
疫情实在找不到工作,就去了外包。姑且也算是搬砖了一个月了,近日有些时间写一些东西吧。勉强算是C语言开发工程师,打打杂,划划水的样子。外包外包,写代码似乎没有什么,看看代码,改改变量名混混日子,时间够了就跑(8小时工作制每天得满8小时啊,吃饭休息时间当然得刨除啊)。记录一下工作用以及生活上遇到的比较好的东西。工具:BeyondCompared4(差异对比工具工作中用来对比上一版本和下一版本的差异的,做适配用)推荐! Mobaxterm(终端工具) SourceInsight(接触没多久,感原创 2020-10-06 16:34:01 · 231 阅读 · 0 评论 -
面试记录
面试了,把提到的问题记录一下,顺带整理下答案。C语言:预处理(宏定义、文件包含、条件编译)#define预编译条件编译#ifndef#define#endif宏定义判断,防止多重定义const关键字:修饰变量变量的值不能改变const和指针:限制指针变量本身,限制指针指向的数据由const和指针变量的位置决定constint*p1;p1指针本身可以修改,指向的数据不能改intconst*p2;p2指针本身可以修改,指向的数据不能改int...原创 2020-09-03 13:01:48 · 232 阅读 · 0 评论 -
数据结构与算法笔记(十五)案例
根据四个步骤分析解决问题复杂度分析 定位问题 数据操作分析 编码练习题:1.裴波那契数列0,1,1,2,3,5,8,13,21,34,...数列中的元素的性质是,某个数等于他前面两个数的和。a[n+2]=a[n+1]+a[n]启示元素为0,1,在这个数列中的数字被称为裴波那契数题目:写一个函数,输入x,输出裴波那契数列中第x位的元素(用递归实现) public static int forb1(int x){ int r; if (原创 2020-09-02 21:41:48 · 257 阅读 · 0 评论 -
数据结构与算法笔记(十四)定位问题
首先。明确目标 然后。定位问题: 问题的类型(排序、查找、最优化) 问题可能的最低复杂度 采用数据结构或算法 通用解题方法复杂度分析 定位问题 数据操作分析 编码寻找数组出现次数最多的问题方法一:最暴力的方法,双循环第一层遍历所有元素第二层计算每个元素的出现次数,比较当前元素出现次数和最大出现次数的大小时间复杂度为O(n²)方法二:最低时间复杂度O(n),至少需要遍历一次全部元素使用哈希表,key为元素,value为出现次数循环一次原数组创建哈原创 2020-08-25 13:54:54 · 278 阅读 · 0 评论 -
数据结构与算法笔记(十三)动态规划
动态规划从数学的视角来看,动态规划是一种运筹学方法,是在多轮决策过程中的最优方法。从分治法的视角来看,每个子问题必须相互独立。但在多轮决策中,这个假设显然不成立。这也是动态规划方法产生的原因之一动态规划的基本方法动态规划问题没有标准化的解题方法,但它有一些宏观层面通用的方法论:下面的 k 表示多轮决策的第 k 轮:分阶段,将原问题划分成几个子问题。一个子问题就是多轮决策的一个阶段,它们可以是不满足独立性的。 找状态,选择合适的状态变量 Sk。它需要具备描述多轮决策过程的演变,更像是原创 2020-08-25 12:56:09 · 250 阅读 · 0 评论 -
数据结构与算法笔记(十二)排序
排序就是让一组无序数据变成有序的过程。 一般默认这里的有序都是从小到大的排列顺序衡量一个排序算法的优劣,主要从三个角度分析:时间复杂度:包括最好时间复杂度、最快时间复杂度、平均时间复杂度 空间复杂度:如果空间复杂度为1,也叫原地排序 稳定度:是指相等的数据对象,在排序之后,顺序能否保持不变常见排序算法:冒泡排序1.原理从第一个数据开始,依次比较相邻元素的大小。如果前者大于后者,则进行交换操作,把大的元素往后交换。通过多轮迭代,直到没有交换操作为止。2.性能冒泡排序最好时间原创 2020-08-24 16:37:22 · 174 阅读 · 0 评论 -
数据结构与算法笔记(十一)分治
从定性的角度来看,分治法的核心思想就是“分而治之”。利用分而治之的思想,就可以把一个大规模、高难度的问题,分解为若干个小规模、低难度的小问题。随后,开发者将面对多个简单的问题,并很快地找到答案各个击破。在把这些简单问题解决好之后,我们通过把这些小问题的答案合并,就得到了原问题的答案。在大数据上分治才具有价值。...原创 2020-08-24 15:49:34 · 147 阅读 · 0 评论 -
数据结构与算法笔记(十)递归
数据结构还是算法思维的最终目的都是降低时间复杂度。数据结构是从数据组织形式的角度达成这个目标,而算法思维则是从数据处理的思路上去达成这个目标。递归递归 (Recursion))是指在函数的定义中使用函数自身的方法(函数自己调用自己)递归的两层含义:递归问题必须可以分解为若干个规模较小、与原问题形式相同的子问题。并且这些子问题可以用完全相同的解题思路来解决; 递归问题的演化过程是一个对原问题从大到小进行拆解的过程,并且会有一个明确的终点(临界点)。一旦原问题到达了这个临界点,就不用再往更原创 2020-08-23 20:36:08 · 151 阅读 · 0 评论 -
数据结构与算法笔记(九)哈希表
哈希表哈希表名字源于 Hash,也可以叫作散列表。哈希表是一种特殊的数据结构,它与数组、链表以及树等我们之前学过的数据结构相比,有很明显的区别。哈希表的核心思想哈希表的设计采用了函数映射的思想,将记录的存储位置与记录的关键字关联起来。这样的设计方式,能够快速定位到想要查找的记录,而且不需要与表中存在的记录的关键字比较后再来进行查找设计哈希表方法:直接定址法 数字分析法 平方取中法 折叠发 除留余数法哈希冲突的解决方法开放定址法 链地址法哈希表的基本操作在很.原创 2020-08-23 14:15:38 · 869 阅读 · 0 评论 -
数据结构与算法笔记(八)树和二叉树
树:不做具体树的介绍树是由结点和边组成的,不存在环的一种数据结构树满足递归定义的特性。也就是说,如果一个数据结构是树结构,那么剔除掉根结点后,得到的若干个子结构也是树,通常称作子树。二叉树中,每个结点最多有两个分支,即每个结点最多有两个子结点,分别称作左子结点和右子结点。满二叉树,定义为除了叶子结点外,所有结点都有 2 个子结点。 完全二叉树,定义为除了最后一层以外,其他层的结点个数都达到最大,并且最后一层的叶子结点都靠左排列。二叉树的储存方法:链式储存法: 顺序储存法:树的原创 2020-08-22 19:37:38 · 177 阅读 · 0 评论 -
数据结构与算法笔记(七)字符串
字符串string是由n个字符组成的有序整体字符串分为顺序储存结构和链式储存结构两种顺序储存结构: 链式储存结构:字符串的基本操作新增操作:删除操作:查找操作:子串查找操作(字符串匹配)例:假设有且仅有 1 个最大公共子串。比如,输入 a = "13452439", b = "123456"。由于字符串 "345" 同时在 a 和 b 中出现,且是同时出现在 a 和 b 中的最长子串。因此输出 "345"。...原创 2020-08-22 17:09:38 · 169 阅读 · 0 评论 -
数据结构与算法笔记(六)数组
数组是数据结构中最基本结构。存放整型数的数组是整型数组存放字符型的数组是字符数组数组的数组是二维数组数组把同一类型的元素按照一种不规则的顺序进行排列,这些排好的同类数据元素的集合就是数组数组在内存中是连续存放的,数组的数据可以通过索引取出。数组的索引从0开始。数组的基本操作新增操作:在数组的最后增加一个新的元素,直接新增操作即可,时间复杂度为O(1) 在数组中间的某个位置新增数据,新增数据之后,插入元素位置之后的元素的位置需要依次往后移删除操作:删除数组的最后一个原创 2020-08-21 23:33:22 · 161 阅读 · 0 评论 -
数据结构与算法笔记(五)队列
队列队列也是一种特殊的线性表,是先进先出。先进:队列的数据新增操作只能在末端进行,不能再队列的中间某个节点后新增数据 先出:队列的数据删除操作只能在始端进行,不嫩那个在队列的中间某个节点后删除节点队列的增只能在队列的队尾,删只能在队列的队头进行队列也存在两种储存方式,顺序队列和链式队列链式队列: 链式队列:队列的增删查处理循环队列的数据操作例:...原创 2020-08-21 22:11:36 · 265 阅读 · 0 评论 -
数据结构与算法笔记(四)栈
栈是一种特殊的线性表,栈的数据节点必须后进先出。浏览器的页面前进和后退功能就是一个典型的后进先出的场景,适合使用栈数据结构。表尾用于输入数据,通常叫做栈顶top,表头是栈底bottom。栈顶和栈底用来表示这个站的两个指针。栈分为顺序栈和链栈。栈的基本操作初始时,站内没有数据,即空栈。此时栈底就是栈顶。当存入数据时,最先放入的数据进入栈底,加入的数据会被放到栈顶的位置。要删除数据也是从栈顶开始向栈底删除。对于栈的新增操作称为push或压栈,对于栈的删除操作称为pop或出栈。顺序栈栈的顺原创 2020-08-21 00:15:36 · 256 阅读 · 0 评论 -
数据结构与算法笔记(二)基本操作
基本操作:增删改查原创 2020-08-20 00:49:17 · 421 阅读 · 0 评论 -
数据结构与算法笔记(一)简介
数据结构与算法至关重要。计算机是一个内存有限,计算能力有限的机器,如果每段时间处理的数据增加量大于每段时间能处理的数据量,时间越长,电脑执行会越来越慢直至死机。复杂度:复杂度是衡量程序运行的效率的量度因素。执行代码消耗计算时间和计算空间,衡量的是时间复杂度和空间复杂度。复杂度是一个关于输入量n的函数。假如代码的复杂度f(n)。O(n)表示的是复杂度与计算实例的个数n线性相关;O(logn)表示的是复杂度与计算实例的个数n对数相关。复杂度与具体的常数无关{ O(n)与O(3n)是同样..原创 2020-08-19 20:51:30 · 133 阅读 · 0 评论 -
linux内核笔记(五)高级I/O操作(三)
mmap设备文件操作定位操作原创 2020-08-19 12:38:54 · 292 阅读 · 0 评论 -
linux内核笔记(四)高级I/O操作(二)
异步I/OI/O模型总结异步通知mmap设备文件操作定位操作原创 2020-08-17 19:09:21 · 293 阅读 · 0 评论 -
linux内核笔记(三)高级I/O操作(一)
ioctl设备操作proc文件操作非阻塞型I/O阻塞型I/OI/O多路复用原创 2020-08-16 17:31:50 · 530 阅读 · 0 评论 -
linux内核笔记(二)字符设备驱动
字符设备驱动原创 2020-08-10 18:10:18 · 626 阅读 · 1 评论 -
make编译笔记(五)隐含规则
隐含规则原创 2020-08-08 19:02:27 · 525 阅读 · 0 评论 -
linux内核笔记(一)
需要了解知识:LinuxC语言Makefile概述Linux是宏内核(或单内核)的操作体系统。(Windows微内核)宏内核是所有的内核功能被整体编译在一起,形成一个单独的内核镜像,内核中各模块的交互是通过直接的函数调用,效率非常高。微内核是实现内核中相当关键和核心的一部分,其他功能模块被单独编译,功能模块之间的交互通过微内核提供的某种通信机制来建立的。宏内核如果要增加、删除、修改内核的某个功能,就不得不重新编译整个内核,为了解决这一问题,引入了内核模块。内核模块是被单独编译原创 2020-08-05 16:26:38 · 162 阅读 · 0 评论 -
make编译笔记(六)
make工具与函数库练习与答案原创 2020-08-10 23:05:27 · 232 阅读 · 0 评论 -
make编译笔记(四)
基本函数的使用make的运行隐含规则原创 2020-08-06 19:26:48 · 627 阅读 · 0 评论 -
make编译笔记(三)
变量的基本操作条件判断原创 2020-08-04 21:53:00 · 354 阅读 · 0 评论 -
make编译笔记(二)
Makefile基本规则原创 2020-08-03 21:37:38 · 477 阅读 · 0 评论 -
make编译笔记(一)
实在是太多太长了,分。Makefile关系到整个工程的编译规则。规定了一些列的规则,来指定哪些文件需要先编译,那些文件需要后编译,那些文件需要重新编译。为了完成对工程文件的编译,并生成执行文件,可以这样编译这些源文件。gcc xxx.c ccc.c cccc.c -o main但这样效率低下,修改了某个就需要全部重新编。给每个文件编译,再拿这些编译好的编译就会快很多,但这样又容易出错。需要一个能够按照一定规则对源文件编译的文件,就是Makefile文件。...原创 2020-07-31 21:44:19 · 851 阅读 · 0 评论 -
LinuxC网络编程笔记(三)
原始套接字编程原始套接字使一种非面向连接的,c/s传输方式的网络编程。使用原始套接字编程进行服务器端与客户端的通信前,都要创建各自的套接字,然后对应的套接字进行数据传输。在数据传输过程中,需要使用sendto()函数和recvfrom()函数进行发送与接收,再发送与接收函数中设置相应的IP地址。原始套接字往往应用于高级网络编程,例如网络嗅探器sniffer、拒绝服务攻击DoS、IP欺骗等。并且还可以通过原始套接字来模拟IP的一些实用工具,例如PING命令。创建函数原始套接字编程是SOCK_R原创 2020-07-29 22:24:45 · 262 阅读 · 0 评论 -
LinuxC网络编程笔记(二)
TCP套接字编程例:UDP套接字编程数据传输系统调用发送函数接收函数基于UDP协议的C/S机制的网络通信的工作原理例:原始套接字编程创建函数设置套接字选项原始套接字的发送与接收发送报文的原则接收报文的特点报文处理报文头部结构ICMP协议练习与答案...原创 2020-07-28 20:22:58 · 253 阅读 · 0 评论 -
LinuxC网络编程笔记(一)
OSI模型TCP/IP协议IP地址名称地址转换成数字地址数字地址转成名字地址得到当前主机的名字的函数服务器名与端口号之间额转换函数套接字编程原创 2020-07-27 16:16:51 · 160 阅读 · 0 评论 -
信号及信号处理笔记
在终端输入kill -1可以列出Linux中的所有信号。信号处理信号最为进程间通信的机制,主要用于异步事件。有3种基本处理信号的方法:默认。系统为每一个信号都设置了默认的处理方式,通常为终止进程。 捕捉信,使进程执行指定的程序 忽略信号,不处理,进程继续执行。产生信号捕捉信号信号阻塞信号处理安全问题...原创 2020-07-21 23:55:29 · 330 阅读 · 0 评论 -
文件操作笔记(二)
特殊文件的操作目录文件的操作获取当前的工作目录改变当前的工作目录创建和删除目录打开与关闭文件读取目录文件链接文件的操作硬链接符号链接设备文件练习与答案1.通过系统调用函数symlink()为已经存在的文件eq1.c创建一个符号链接,名为symbol.c。打开这个符号链接文件,获取该文件的名称,10s后,通过unlink()函数删除此符号链接。2.使用mkdir()函数创建一个新的工作目录文件...原创 2020-07-15 22:21:13 · 216 阅读 · 1 评论 -
文件操作笔记(一)
文件文件的属性文件类型文件权限文件的相关信息文件的目录结构索引节点文件中存放的数据文件的相关操作修改文件属性改变文件的所有者改变文件的访问权限改变文件的名称改变文件的长度复制文件描述符获取文件信息文件的其他操作将缓冲区数据写回磁盘锁定文件特殊文件的操作...原创 2020-07-15 19:44:36 · 205 阅读 · 0 评论 -
文件的输入和输出操作笔记
文件I/O操作原创 2020-07-19 23:19:22 · 380 阅读 · 0 评论 -
进程间通信笔记(二)
消息队列消息队列是一种通过链表结构组织的一组消息,消息是链表中具有一定格式及优先级的数据记录。消息队列与其他两种进程间通信对象(共享内存,信号量)相同,都存放在内核中,多个进程通过消息队列的标识符对消息数据进行传送,实现进程间的通信。每个消息队列都有与之对应的结构,用于定义一个消息队列的对象。结构体类型定义(部分关键)struct msqid_ds{struct ipc_perm msg_perm;//消息队列指向ipc_perm结构的指针struct msg *msg_first;//指原创 2020-07-15 12:56:38 · 204 阅读 · 0 评论 -
进程间通信笔记(一)
概述进程间通信(Inter-Process Communication,IPC)是指两个或多个不同的进程间传递或交换信息,通过信息的传递建立几个进程间的联系,协调一个系统中的多个进程之间的行为。进程间通信的工作原理进程与进程之前互相独立,各自运行在自己的虚拟内存中。进程之间建立联系,通过内核,在内核中开辟一个缓冲区,两个进程的信息在缓冲区中进行交换或者传递。-》通过内核。进程间通信的主要分类在linux中,常见的包括管道通信、共享内存通信、信号量通信、消息队列通信、套接字(SOCKET)原创 2020-07-15 00:06:06 · 317 阅读 · 0 评论 -
进程控制笔记(二)
多个进程间的关系linux系统支持多进程同时运行,多个进程分配到多个处理上运行,快速方便。但多个进程在一个系统中协调运行,并不容易。进程组一个或多个进程的集合。作为一个进程组,里面的每一个进程都有统一的进程标志。可以通过getpgrp()函数获取进程组ID。#include<sys/types.h>#include<unistd.h>pid_t getpgrp(void);在进程组中有一个特色的进程的ID与进程组ID相同。使用setpgid()函数创原创 2020-07-12 22:30:15 · 171 阅读 · 0 评论 -
进程控制笔记(一)
进程具有五种特性:动态性 并发性 独立性 异步性 结构特性进程的相关信息:进程ID:在Linux系统中,每个进程都有其唯一的ID。在linux下编写关于进程的C程序,经常会使用到一个数据类型pid_t,这个类型专门用来定义进程的ID,是一个非负的整数。进程的状态:三种基本状态分别是运行状态、等待状态、结束状态。还有就绪、挂起和僵尸等状态。进程的切换:就是从正在运行的进程中收回处理器的使用权,等待运行进程进来时占有此时的处理器。虚拟内存:在linux系统中,每个进程都运行在各自的原创 2020-07-11 23:36:56 · 146 阅读 · 0 评论 -
GDB调试工具笔记
简介:是linux平台最常见的调试工具。通过设置断点、单步跟踪、显示数据等功能可以快速找到bug,然后修bug。GDB是专门用来调试C和C++程序的,可以在程序运行时观察程序的内部结构和内存的使用情况。直接在终端输入gdb命令进入GDB调试界面。GDB调试器主要实现3方面的功能启动被调试的程序 使被调试的程序在指定位置停住 当程序被停住时,可以检查程序此时的状态命令启动程序 设置断点 查看信息 分布运行 改变环境...原创 2020-07-07 23:27:43 · 268 阅读 · 0 评论 -
GCC编译器笔记
简介目前在Linux下最常用的C语言编译器是GCC(GUN Compiler Collection).是GUN项目中符合ANSI C标准的编译系统。能够编译C、C++、Object C等语言编写的程序,可以通过不同的前端模块来支持各种语言,如JAVA等。基本常用参数GCC编译器的调用参数有100多个,介绍几个最基本常用的参数。GCC的基本用法gcc [options] [filenames]options为编译器需要的参数,filenames为相关文件的名称。-c只编译,原创 2020-07-05 21:58:19 · 218 阅读 · 0 评论