- 博客(27)
- 收藏
- 关注
原创 Linux软件编程——线程(2)
5. 销毁锁:int pthread_mutex_destroy(pthread_mutex_t *mutex);4. 解锁:int pthread_mutex_unlock(pthread_mutex_t *mutex);3. 加锁:int pthread_mutex_lock(pthread_mutex_t *mutex);1. 分离属性:不需要被其他线程回收的线程称为分离属性得到线程,将来会被操作系统所回收。2. 非分离属性:可以被其他线程回收或者结束的线程,称为非分离属性的线程。
2025-08-18 20:47:45
549
原创 Linux操作系统 ——文件操作2
pragma pack 是 编译器指令,用于控制结构体的 内存对齐方式:#pragma pack(push, n):保存当前对齐方式,并设置新的对齐字节数 n(n=1 表示1字节对齐)#pragma pack(pop):恢复之前保存的对齐方式。该结构体中的字节数只有9个,但实际所占内存为12;当他们以字节对齐,实际上也就只占了9个如:查看bmp图片的像素例题说明:①#pragma pack(push, 1) 的作用取消结构体对齐优化,使所有字段紧密排列(无填充字节)。
2025-08-11 20:15:23
752
原创 Linux操作系统
普通文件 ------->xxx.c xxx.h xxx.txt xxx.jpg xxx.mp4 a.out。FILE * ---》文件流指针----》已打开文件。Linux内核提供的一套对文件操作的操作方法------->系统调用。"r+" 以读写的方式打开。C标准库提供的一套对文件操作的操作方法------->库函数。c 字符设备文件 ------->如输入输出设备(鼠标键盘显示器...)I : input O: output ----->文件。
2025-08-11 15:14:10
1101
原创 数据结构二叉树与gdb应用
树是n(n≥0)个结点的有限集合。当n=0时称为空树;非空树满足:有且仅有一个特定的称为根(Root)的结点其余结点可分为m(m≥0)个互不相交的有限集合,每个集合本身又是一棵树,称为根的子树(SubTree)
2025-08-09 14:42:34
752
原创 数据结构——哈希函数
哈希存储:将要存储的数据的关键字和存储位置之间,建立起对应的关系,这个关系称之为哈希函数。存储数据时,通过对应的哈希函数可以将数据映射到指定的存储位置;根据上述哈希函数,建立一个哈希表,存放78 ,98应该存储在88之后,但88后只有一个空间存储数据,则78存入,而98则通过探测序列,动态查找下一个空闲位置,即21之后。解决哈希冲突在此解释两个方法,根据该哈希函数插入10,21,23,45,76,88。构造哈希表,在哈希表中的每一个槽位存入每个链表的头节点地址,以链表形式进行数据存储。
2025-08-07 18:37:56
732
原创 数组与结构——栈和队列
二级指针:1. 在被调函数中,想要修改主调函数中的指针变量,需要传递该指针变量的地址,形参用二级指针接收。2.指针数组的数组名是一个二级指针,指针数组的数组名作为参数传递时,可用二级指针接收。指针数组:保存多个指针的数组。数组名:数组首元素地址。
2025-08-06 21:35:52
721
原创 vi编辑器makefile的使用以及双向链表
时间戳:在编译代码时,只编译修改后的源文件,其他没有修改的,只进行链接即可。名称:Makefile、makefile(只有两种形式,首字母大写或小写)Makefile :用来管理代码的编译和链接。②在编写文件(.c)中编写创建双向链表函数。(3)遍历双向链表(正向遍历,逆向遍历)(注:$(OBJ) : $(SRC))依赖文件:main.c fun.c。链接:处理多文件及函数的链接关系。-L:指定使用到的库所在的位置。汇编:将汇编指令生成二进制指令。预处理:处理和#相关的指令。①在头文件(.h)中声明。
2025-08-05 20:36:02
703
原创 数据结构——单向链表
散列结构(哈希结构):将数据的存储位置与数据元素之间的关键字建立起对应的关系(哈希函数),根据该关系进行数据的存储和查找。接下里将从创建链表对象,插入数据,删除数据,查找数据,修改数据,销毁数据介绍单向链表。线性结构:数据元素与元素之间存在一对一的关系(如:顺序表,链表,队列、栈)链表:对象(存储数据的对象) ——> 属性(变量)、行为(函数)图形结构:数据元素与元素之间存在多对多的关系(如:网状结构)树形结构:数据元素与元素之间存在一对多的关系(如:二叉树)集合:数据元素与数据元素之间平等的集合关系。
2025-08-04 22:09:49
457
原创 C语言 —— 指针(4)
申请的空间是连续的,成功时返回指向内存分配的指针(类型为void * 型,通常需要进行强制类型转换),失败时返回空指针(NULL)。需手动管理内存,所分配的内存不会自动释放,必须调用free()避免内存泄漏。指针数组是指一个数组,其元素都是指针,简单地说,数组中的每一个元素存储都是一个内存地址,而不是直接存储数据。eg:如原来申请内存只能容纳长度为10的一维整型数组,现在改为可容纳长度为20的一维整形数组。它存储的是函数的地址,而不是数据变量的地址。返回值指向新的内存,与原来的p指向的内存可能不同。
2025-07-30 20:57:39
846
原创 C语言 —— 指针和字符型数组
在介绍字符型数组与指针的关系前,先回忆一下字符型数组:字符数组是C语言中存储字符串的基本方式,它的特点如下:在内存中连续存储;以'\0'作为字符串结束标志;数组名代表数组首地址。
2025-07-29 20:21:55
883
原创 C语言——指针与一维数组
其目标是将数组分为两部分,左边部分小于基准数t,右边部分大于基准数t。(大都选择数组第一个元素为基准数t)其结果依旧是一个指针,新的指针是在原来的地址基础上加n * (sizeof(基类型))个字节。两指针相见必须保持类型一致,其差的结果为相差基类型的个数。*(a + 1)表示第一个元素的值,*(a + 1)等价于a[1] ,值为2;p 代表数组首元素的地址,即*p表示数组首元素的值,所以为1;++p表达式加了,p的值也加了1,所以*++p的值为3;p++表达式没加,所以*p++也是首元素的值为1;
2025-07-28 20:23:26
401
原创 C语言——函数
通过编译器将我们所编写的代码进行编译,函数第一条代码的地址就是函数入口的地址,在汇编层面,函数调用的本质是一系列机器指令的组合,即指令集。这两种递归调用都是无终止的自身调用,显然,程序中不应该出现这种无终止的自身调用,而只应该出现有限次数,有终止的递归调用,所以可以用if语句来控制,只在某一条件成立的情况才会执行递归调用,反之则不再继续。出栈(恢复现场):当pc执行到被调函数的return时,会从“栈”中获取入栈时的位置,然后再根据先进后出的规则一层一层回到主函数时的位置。例如:调用函数交换a,b的值。
2025-07-24 20:42:40
524
原创 C语言——数组(3)及 函数
主函数写在其他函数之后,所以主函数是程序的入口,函数的调用可以提高代码的复用性,降低程序的耦合性,简单的说就是善于用于函数,以减少程序的重复编写。如:a[3][4] = {{1,2,3,4},{5,6,7},{8,9,10,11},我们知道当数组赋值个数少于数组的元素个数,会补零。一个C语言程序可以由一个主函数和若干个其他函数组成,主函数可以调用其他函数,其他函数也可以调用其他函数。在C语言中,函数参数用于传递值,函数的值指返回值 ,表示输出结果,函数调用通过函数名和参数列表实现具体操作。
2025-07-23 20:48:27
751
原创 C语言——数组2
注意:虽然我们只打入了五个字符,占五个字节,但是它实际上占了六个字节,这是因为字符串需要 ‘ \0 ’,结尾,所以上面字符数组的实际存储为。在上一节中,我们提到了一些数组排序算法,那我们需要对数组进行排序呢,有什么目的?它的赋值有多个形式如:char s [100] = { 'H','e','l','l','o'};sizeof:是数组长度,其值为100,当数组未定义长度,其值为7(因为六个字符+一个‘\0’)如一个数组[ begin,end],其中begin,end分别为起始点和结束点。
2025-07-22 19:35:24
883
原创 c语言 ——数组(1)
选择排序的工作方式是:每次从待排序的数据中找出最小(或最大)的元素,放到已排序序列的末尾。数组逆序就是将数组中的元素顺序完全颠倒过来,第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,以此类推。冒泡排序:冒泡排序通过不断比较相邻元素并交换它们的位置来排序,较大的元素会像气泡一样逐渐"浮"到数组的顶端。插入排序的思路类似于我们整理扑克牌的方式:将未排序的元素逐个插入到已排序部分的适当位置。最后一个元素的下标值是元素个数减1。3、数组的数组名代表数组首元素的首地址,表达式a代表的取首地址a[0].
2025-07-21 22:06:36
353
原创 C语言——循环控制
需要将循环体用{ }围起来,在代码前对循环体(反复执行的代码称为循环的循环体)进行命名,即标识符。当多个循环嵌套,想使用break语句跳出整个循环,在内层循环终止后用if语句内层循环的值用内层循环表达式2进行判定,若为真,再用if语句使用break语句跳出外循环。表达式为逻辑表达式,进入循环时,对逻辑表达式求值,逻辑为真,则进入循环体,然后在对逻辑求值,反复进行,直至逻辑为假,循环结束。break语句会立即终止当前的循环的控制语句,当多个循环嵌套,在内层循环使用break语句,它只退出它所在的当前循环。
2025-07-20 16:35:54
531
原创 C语言关系运算符及表达式,逻辑运算符及表达式,以及if语句,switch语句
当问题复杂时,if语句是可以实现嵌套的,当涉及多层判定时,如(判断一年中的每个月有多少天,还要对闰年,平年的2月在进行判断)if语句是条件判断语句,else会主动去找最近的if语句,它与if成对出现,不会单独出现。逻辑与(&&):两边为真,逻辑量为“真”,逻辑运算结果为1,两个中有一个为假,C的逻辑运算结果为0,逻辑非(||) :一个为真,逻辑运算结果为“真”(1),两边为假,逻辑量为“假”(0)在关系表达式中,杜绝连续比较,需要连续比较时,则需要逻辑运算符。逻辑表达式的值是一个逻辑量“真”或“假”
2025-07-18 21:56:23
494
原创 C语言数据输入输出函数
越界访问:当格式字符串不匹配时,比如short形为2/字节,int形为4字节,当int相传人short形时会产生越界访问,导致编译错误,还有数值范围,short形的范围 -32768~32767,当输入一个更大的数也会产生越界访问,所以在编译时需要注意字节数是否匹配,数值是否在数据类型的范围之内。② o , u , x , X:用于输出无符号的八进制(o),输出无符号的十进制(u),用于输出无符号的十六进制(x,X)的整数。在C的函数库中,有多个“标准的输入输出函数”,本文介绍四个常用的输入输出函数。
2025-07-17 20:55:32
581
原创 C语言基础——字符型及运算符,赋值
+ i 与 i + +区别不大,+ + i 是在使用 i 之前对 i 增加 1 ,i + + 是在使用 i 之后对 i 增加 1 ,在循环语句等大部分情况下,前+ +的效率高于后+ +,这是因为前 + +是在变量 i 原有的地址进行递增,后 + +是需要重新找内存地址进行递增在返回递增前的值。(注意,箭头的高低只代表数据类型级别的高低,当int型和double型进行混合运算时,int型的数据并不是逐级转换为double型,而是直接从int型转变为double型)并且单引号内的字符是区分大小写的。
2025-07-16 20:24:33
923
原创 C语言的数据类型(整形,字符型,浮点型)
十进制的10的二进制形式为1010(在不同的编译系统中为整形数据分配的字节数是不同的),我们假定该编译系统为其分配了2个字节。(1byte=8bit),其数值是以补码的形式表示的,一个正整数的原码,反码,补码是相同的。C语言规定:标识符只能由字母,数字和 '_' 组成,且数字不能开头,如3a_d就是错误的命名,系统还将大写字母和小写字母认为是两个不同的字符,所以num和NUM是两个不同的变量名。而负数的补码与整数不一样,求负数补码的方法是:将该数的绝对值的二进制形式,按位取反再+1,比如求-10的补码。
2025-07-15 20:12:40
1117
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人