自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 哈希表的学习

其核心思想是将数据直接存储到具有固定大小的数组中,通过哈希函数计算出每个数据的存储位置。发生在两个不同的键通过哈希函数映射到相同的数组索引时。为了解决哈希冲突,常见的解决办法主要有以下两种:开放地址法和链地址法,每种方法又有不同的变种和策略。它通过在哈希表的每个索引处维护一个链表(或其他容器),当多个键被映射到同一索引时,直接将它们放入这个链表中。链地址法:在每个哈希表的索引处,维护一个链表或其他容器来存储所有具有相同哈希值的元素。如果冲突过多,链表长度变长,查找效率会退化到 O(n)O(n)O(n)。

2024-09-09 21:46:12 150

原创 链表的总结

节点结构:内核链表节点只包含两个指针,分别指向链表中的前一个节点和后一个节点(如struct list_head { struct list_head* next;插入操作:提供了专门的函数(如list_add、list_add_tail)来在链表的头部或尾部插入节点,也可以在其他节点之后插入。定义:双向链表也是链表的一种,但与单向链表不同,它的每个节点包含两个指针,分别指向直接前驱和直接后继。定义:单向链表是链表的一种,每个节点包含数据域和指向下一个节点的指针域。

2024-09-06 21:04:42 254

原创 双向链表的学习

双向链表是一种数据结构,它由节点组成,每个节点包含两个指针:一个指向前一个节点,另一个指向后一个节点。这种结构允许双向访问,即既可以向前遍历(像单链表一样),也可以向后遍历。这使得在插入和删除元素时效率较高,因为只需要改变相邻节点的指针即可,而不需要像数组那样移动大量元素。

2024-09-05 21:22:23 250

原创 双向链表的学习

双向链表是一种数据结构,它由节点组成,每个节点包含两个指针:一个指向前一个节点,另一个指向后一个节点。这种结构允许数据元素在两个方向上进行遍历,即既可以从前到后(顺序),也可以从后到前(逆序)。相比于单向链表,双向链表提供了一种更直接的访问前驱节点的能力,这在某些场景下效率更高。在双向链表中,插入和删除操作通常比单链表更容易,因为它们不需要像单链表那样逐个节点移动。节点的增删操作可以在O(1)的时间复杂度内完成,只需要更新前后节点的指针即可。

2024-09-04 20:35:16 250

原创 数据结构的学习

散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对应关系从而实现查找的存储方式;程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,缺点:插入删除需要移动大量的元素;一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)线性结构:元素之间一对一的关系(表(数组,链表),队列。数据的物理结构:数据的逻辑结构在计算机内存中的存储形式。图形结构:元素之间多对多的关系(网状结构)树型结构:元素之间一对多的关系(二叉树)数据的逻辑结构:数据元素与元素之间的关系。

2024-09-03 19:52:30 314

原创 Sqlite3数据库的学习

create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, 类名称 数据类型, ...);create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....)create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);column_name :查询结果每个字段的字段名称首地址集合。column_value:查询结果每个字段的首地址集合。

2024-08-29 20:43:45 983

原创 IO多路复用

2024-08-28 20:28:30 70

原创 网络服务端的搭建思维导图

2024-08-27 20:24:01 81

原创 TCP与UDP传输的学习

粘包(Packet Splitting or Message Smuggling)是指在网络通信中,当发送的数据包大小超过接收端设定的最大长度限制时,可能会将大数据包分割成几个小包发送。接收端收到这些小包后,由于它们各自独立,如果不按照原来的顺序重组,就可能导致数据解析错误,形成乱序或者丢失部分信息。例如,在TCP协议中,如果POST请求体过大,服务器可能设置了一个固定大小的缓冲区来接收数据。若一次性发送的数据超过了这个缓冲区大小,就会发生粘包现象,导致后续的小包被视为新的请求,造成数据混淆。

2024-08-23 19:47:26 597

原创 TCP和UDP编程的学习

struct sockaddr *addr //通用地址结构类型,并没有实际去用,实际用到都是具体地址结构类型。struct sockaddr *src_addr, 用来保存发送方的地址信息。第二次握手:服务器接收到客户端的发送,并向客户端发送;void *buf, 保存数据的一块空间的地址。的文件描述符文件与参数2 指定的接口地址关联,参数1所在的描述符中取出并从参数2所在的接口。第三次握手:客户端向服务器发送,证明客户端的接收能力正常;绑定地址:运行所在主机上的地址;服务器程序所在的程序;

2024-08-22 21:02:53 853

原创 网络编程的学习

const struct sockaddr *dest_addr, 表示 要发送到的 地址 (网络地址 ip+端口号 )socklen_t addrlen //表示dest_addr 这个参数的长度。int flags, 0 --- 默认。b/s browser server 浏览器,服务器模型 --- 通用的客户端。//domain --域 (范围) ---socket 用于什么范围的通信。socket 1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)

2024-08-21 19:56:48 495

原创 有名管道和信号的学习

Handler 要对该信号做怎样的处理;(是一个函数指针,指向信号处理函数);只能用于亲缘关系(父子进程)间;前提(在fork之前创建无名管道);失败:SIG_ERR 表示失败;返回值:成功:输出表示上一次设置的信号处理函数的入口地址;信号也被称为软中断:在软件层面实现了一个类似中断的过程;功能:信号处理函数的注册函数(有时也被称为安装函数);信号是一种异步的通信方式;参数:signum 要处理的信号的编号;功能:在指定的目录下创建一个管道。Fifo(先入先出)(队列)参数:mode 管道的权限;

2024-08-17 19:16:28 230

原创 管道的学习

p操作逻辑:尝试获取资源,有资源可用,直接使用,资源个数减一;表示进程间使用信号量。如果sem没有资源(==0),则线程阻塞等待,一旦有资源。信号量集() 信号量 (6)如果sem有资源(==1),则申请该资源,程序继续运行。管道:无名管道 (1)有名管道 (2)消息队列 (用的相对少,这里不讨论) (4)int sem_wait(sem_t *sem);可以读管道,但是管道中如果没有数据了,此时读操作 不阻塞。

2024-08-16 20:00:26 447

原创 线程的进阶学习

1.pthread_join //需要自己回收 ---线程的属性 (可结合性) --- 一般是子线程 在较短时间内运行完。2.pthread_detach //可分离属性 ---子线程运行很久才结束 --- 设置分离属性。可结合性 --- pthread_join这种用于线程任务较短,主线程需要关心子线程状态。定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁。

2024-08-15 19:57:11 635

原创 线程的学习

如果用在main函数中 表示结束主线程结束,并不表示进程;此时,主线程执行流结束,进程会在其余线程都结束后,结束。start_routine -- 线程执行函数 (线程回调函数)指向[指针函数的] 函数指针。waitpid 非阻塞的方式:调用进程 逻辑一般不受影响waitpid 想要处理到子进,必须套在循环中;(在哪个线程中调用,获得的就是那个线程的tid)参数:retval 退出状态值(传的是退出状态值对应的地址)2.线程共享了进程的资源 (代码段,数据段,打开一些文件,信号等)

2024-08-14 19:00:24 486

原创 进程创建之后的运行学习

(2)父子进程做的事不同,名称也不同,如:shell系统——bash,在这里调用了exec函数族,作用是启动(运行)了一个新的程序,本质是在函数调用后用新的镜像程序替代当下的程序。execle和execvpe,“e”表示环境变量environ,可以调用extern char **environ作环境变量,在传参的最后要加环境变量environ;int execl(const char *path, const char *arg, ...) —— execl(“路径”,“程序名”,“参数”,NULL);

2024-08-13 20:58:34 868

原创 进程的学习

/bss --未初始化的 全局变量 或 静态变量。[静态区(全局区)] //data --已初始化的 全局变量 或 静态变量。信号相关设置 //处理异步io, ---段错误。进程: (占用 cpu ,内存相关的资源 ,IO资源(屏幕,键盘))[代码区 ] //text (正文) --代码段。进程:(进行中的程序)--正在运行的程序 (动态的) ---内存。data --- 初始化了的数据 | 静态区 | ---数据。bss --- 未初始化的数据 |

2024-08-12 20:16:48 695

原创 文件IO的学习

参数:oldpath:被链接向的文件的路径;newpath:新符号链接文件。参数:oldpath:要链接向的文件;newpath:创建的新硬链接文件。返回值:成功返回保存日历时间结构体的指针;返回值:成功返回获得时间字符串的首地址;参数:oldpath:老路径名;功能:创建一个链接向oldpath文件的新符号链接文件。返回值:成功返回1970年到现在的秒数;2.转换为需要个格式。功能:打印s字符串和errno对应的错误信息。参数:pathname:删除文件的路径。参数:timep:保存秒数空间的地址。

2024-08-08 18:56:50 477

原创 文件io学习

返回值:包含文件信息的结构体出错或者读到目录流末尾返回NULL。返回值:成功返回文件流指针;功能:从目录流中读取文件信息并将保存信息的结构体地址返回。成功返回包含路径空间的字符串首地址。返回值:成功返回目录流指针;参数:opendir的返回结果中目录流对象。返回值:成功返回文件描述符;功能:获得一个文件流指针中的文件描述符。参数:buf:保存工作路径空间的首地址。参数:pathname:目录文件的名字。功能:打开一个目录获得一个目录流指针。参数:fd:已经打开的文件描述符。返回值:成功返回0;

2024-08-07 19:48:40 260

原创 文件IO相关函数学习

O_EXCL,需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败。界面交互 出错处理。O_ASYNC异步io,什么时候io不确定,三、rewind() 等效于:fseek(stream,0L,SEEK_SET);如果值为负数,则向文件开头偏移。内核每打开一个文件就会获得一个文件 描述符。buf:要写入文件的字符串的首地址。如果值为整数,则向文件末尾偏移。whence 偏移的起始位置,由系统定义的三个宏开始。通过文件描述符向文件中写一串数据。

2024-08-06 19:47:20 439

原创 【无标题】

eg : ====》stdio.h ===>stdio.c==>libc.so ==>/usr/lib so 动态库。man xxx == man 1 xxx ===>查看当前xxx命令。man 2 xxx ===>查看xxx对应的系统调用函数。man 3 xxx ===》查看xxx对应的标准库函数。I: 键盘是标准输入设备 ====》默认输入就是指键盘 /dev/input。3.fgets会读到n个数据,如果n个数据中存在\n字符则立即停止当前的读取操作。ASCII码数据的流 \n \t。

2024-08-05 18:16:36 925

原创 Linux系统编程的学习

2.位置变量: ./3.sh /etc/passwd 123 456 内置变量。编译型语言先编译再执行;-b 块设备文件 test -b /dev/usb0。" ":打印字符串,遇到$变量则打印变量中的值。' ':打印字符串,遇到$变量依然打印$变量。` `:将中间的字符串按照命令打印。:上一句shell命令执行的结果。HOME:当前登录用户的家目录。$$:当前shell的PID。PWD:当前所在的工作路径。$1:传入脚本的第一个参数。$2:传入脚本的第二个参数。$#:传入参数的个数。

2024-08-03 19:03:41 264

原创 共用体和位运算的学习

对于有符号的值,如果原来符号位为0(该数为正),则左边也是移人0,如同上例表示的那样。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移人0,有的系统移入 1。移入0的称为“逻辑右移”,即简单右移;移入1的称为“算术右移”。所有的位运算运算操作数必须为整型或与整形相兼容的数据类型;可以用共用体中的存储防止来判断计算机为大端还是小端;也可以用于不定义额外变量交换两个数的值,只限于整型;共用体中的成员地址相同;常常用来对一个数据的某些值变为1;根据已有的数据类型起别称;

2024-08-02 20:09:29 232

原创 结构体的学习

每个节点通常包含一个指向前一个节点的引用和一个指向下一个节点的引用。在这种结构中,链表的第一个节点直接指向第二个节点,最后一个节点的next字段通常是空(NULL)。4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;声明一个结构体类型的一般形式为。

2024-08-01 18:43:05 370

原创 特殊指针的学习

int (* p) [ 10 ]定义了一个指向长度为10的数组的指针;*(a + i) çè a[ i ] çè&a[ i ][ 0 ] (属于int * 型)回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用。&a 是整个数组的首地址,二者在数值上相等,但意义不同;要修改变量的值需要给被调函数中传递该变量的地址;argc和argv 就是main函数的形参;注意此处的函数名即为该函数的入口地址;main函数是由操作系统调用的;目的:为了降低函数的耦合性;

2024-07-31 18:59:29 401

原创 指针与字符串的学习

如果请求的空间不够用应采用realloc函数延申开辟的空间,销毁原来的空间;两个地址相减必须两个指针的基类型一致;该指针所指向的地址不可更改;但可以通过该指针去修改该地址的变量的值;无法通过该指针再修改它所指向的变量。需要更大的空间时就需要请求一块更大的内存,这样的内存区在堆区;不能通过指针P来修改i的值,只可读而不能修改(间接访问时);可以接收任何类型的地址或指针,而且不产生错误;万能指针不能用于指针运算,主要用于类型的强转;请求成功时,会返回指针首字节的地址;该指针所指向的变量不能作为左值;

2024-07-30 20:12:37 321

原创 指针的学习

指针变量p的指向地址向后偏移{ n x sizeof(基类型)}大多数用于形参,用来修改主调函数中的变量;用来存放变量的地址,运算规则是自右向左;指针是用来装基类型的地址的数据类型;是一种对变量的间接访问;表示的是指针的一种状态。

2024-07-29 17:54:41 368

原创 局部变量和全局变量的学习

函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。但是有时希望程序中一部分内容只在满足一定条件时才进行编译,也就是对这一部分内容指定编译的条件,这就是“条件编译”有时,希望在满足某条件时对某一组语句进行编译,而当条件不满足时则编译另一组语句。有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值。

2024-07-27 20:05:11 878

原创 数组元素作为函数参数的学习

由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素当然可以作为函数的实参,与用变量作实参一样,是单向传递,即“值传送”方式。printArray(a)仅仅是把首元素地址传到被调函数中去;原因:为了编译的高效等价于printArray(&a【0】);此外,数组名也可以做实参和形参,传递的是数组首元素的地址;指针传参,数组一般只传递首元素地址,为了提高编译的高效性;数组元素也可以作为函数实参,其用法与变量相同。可以在被调函数中去修改主调函数;数组元素作为函数参数。

2024-07-26 20:14:47 262

原创 函数的递归调用的学习

向子函数跳转时,会先向栈入住一个主函数该处的地址,执行到return时,进入栈返回到主函数、被调函数无法向主调函数反馈错误,一般用返回-1的方法让主函数来判断错误;4.实参和形参有着不同的内存空间,无法在被调用函数中去修改实参的数值;1.调用函数时,主调函数和被调函数之间又数据传递关系,这是有参函数;子函数被暂时保存在栈中去,遵循FILO原则,先进后出,后进先出的原则。静态区也称为全局区:专门存储那些与进程有关的变量和初始化的常量;3.主调函数中调用一个函数时,函数名后面括号中的参数为实参。

2024-07-25 20:34:57 258

原创 二维数组的定义和使用的学习

一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。所有的高级语言中都有子程序这个概念,用子程序实现模块的功能。在C语言中,子程序的作用是由函数来完成的。一个C程序可由一个主函数和若干个其他函数构成。a[ 0 ]在二维数组中表示一维数组的数组名,与a[ 0 ][ 0 ]的地址相同;注意:二维数组的行数可以被省略,即靠近变量的a[ ][ 4 ],其余不可省略;实参列表中应与函数中的参数个数相同,返回值类型一致;被调函数要出现在主调函数之前,保证主函数在最后面;无参函数定义的一般形式。

2024-07-24 20:15:37 164

原创 字符数组的学习

C语言中把’\0’作为字符结束标志,在程序中往往依靠检测’\0’的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度;由于字符型与整型是互相通用的,因此可以定义一个整型数组,用它存放字符数据;字符串的拷贝strcpy( c , s )(c 是目标数组,s是原数组);用来存放字符数据的数组是字符数组;字符数组中的一个元素存放一个字符;字符串的比较 strcmp( s , c );字符串的链接 strcat( s , c );字符串的打印也可以采用以下函数。字符串和字符串结束标志。

2024-07-23 18:54:42 155

原创 一维数组的学习

Int a [ 10 ]: [ ]不是一个下标运算符,只是一个类型说明符,仅仅为了说明a是一个数组;数组的越界访问:对于访问超出数组下标的元素不会编译报错,而是出现不在数组内元素的地址也就是随机数;说明:类型说明符,任何类型都可以;如果对数组初始化元素个数超出a中的元素个数也会出现越界访问;它表示定义了一个整型数组,数组名为a,此数组有10个元素;如果初始化元素个数少于a中的元素个数,则会补0;如果不进行初始化,则会出现a中元素值都为随机数;2.数组的数组名,代表数组的首元素地址;3.不能对数组进行赋值。

2024-07-22 20:39:48 159

原创 循环控制的学习

(2)从循环体中跳转到循环体外,但在C语言中可以用break语句和continue语句跳出本层循环和结束本次循环。continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。For语句可以用于循环次数确定的情况,也可以用于循环次数不确定而只给出循环结束条件的情况,他完全可以代替while语句。其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。

2024-07-20 19:27:23 240

原创 选择结构程序设计的学习

总结:在触及结构的分支来编写C语言代码时,应时刻注意分支与主干之间的逻辑关系,把每一个分支之间的脉络理清,防止头脑混乱最好的方法就是先绘制流程图,再做相关代码的编写,这样才能保证逻辑关系不再混乱。所谓的“关系运算”实际上式“比较运算”,将两个值进行比较,判断其比较的结果是否符合给定的条件;If语句是用来判定所给的的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。If语句可以嵌套(一般不超过5层)多用于5层函数,其之中的if之间为逻辑与关系;在C语言中不能写出连续比较的形式,会出现错误;

2024-07-19 20:39:38 161

原创 字符输入和输出的学习

为了解决CPU内存占用问题,可以先把输入的数据装入缓冲区,之后再经由CPU处理,由于存入的数据以队列形式输入,在这里遵循“FIFO”的形式,即先入先出的原则;%d会顺次替代后面的输出表列中的内容,如果表列中的内容多于%d的个数则会出现参数的丢失;% m.nf m表示小数点前的位数包括小数点,n为小数点后的位数,m如果小于实际所需的则会产生原始数据,故m一般会省略;%d形式的内容一般被称为占位符,作用是将输出的数据转换为指定的格式输出;地址列表是由若干个地址组成的列表,可以是变量的地址,或者字符串的首地址;

2024-07-18 19:43:28 656

原创 混合运算和混合赋值的学习

要深刻理解变量被计算机存储到内存的抽象到具体的方式,这样才能更加深刻的理解C语言在编译和运行过程;注意:一般,在long = short 时,只用考虑给long型的空间补位即可,signed short只用补其符号位;(先将i的值3赋给j,j的值为3,然后原先i的值还为3,之后i的值变为4)整个逗号表达式的值为表达式2的值。在进行运算时,不同类型的数据要先转换为同一类型,然后进行运算,。即为在i 与j数据类型一致的情况下,直接把j的内存拷贝给i;(i的值先变成4,再赋值给j,j的值为4)

2024-07-17 19:32:12 604

原创 数据类型的学习

如果既不指定为signed,也不指定为unsigned,则隐含为有符号(signed),事实上signed完全可以不写;实际上,数值是以补码的形式表示的,一个正整数的补码和该数的原码(即该数的二进制数形式)相同;字符变量常用来存放字符常量,它只能存放一个字符,不要以为在一个字符变量中可以放一个字符串(包括若干字符);它表示c1,c2为字符型变量,各可以放一个字符,因此子啊本函数中可以用下面的语句对c1,c2进行赋值;整型变量的基本类型符为int,可以根据数值的范围将变量定义为基本整型、短整型或者长整型;

2024-07-16 19:18:12 647

原创 Linux基础命令使用和C语言基础知识

今天学习了Linux操作系统的基本文件操作方式,创建和编译运行C语言代码在操作系统中,了解了C语言的基础数据类型。linux操作系统下的目录结构: / :操作系统最顶级的目录,没有操作权限 表示根目录 分隔符。变量代表内存中具有一定特殊属性的一个存储单元,它用来存储变量的值,在程序运行过程中,其值是可以被改变的。ls -a:查看当前路径下的所有文件(包括以.或者..开头的隐藏文件)cd / 切换到根目录下 cd ~/切换到家目录下的文件。rm :删除一个普通文件或者目录文件。

2024-07-15 18:25:24 148

空空如也

空空如也

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

TA关注的人

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