![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
_好好学习
这个作者很懒,什么都没留下…
展开
-
C/C++——字符串分割(strtok, strtok_s)
1. 使用strtok分割字符串strtok()函数的原型如下:char *__cdecl strtok(char *_String, const char *_Delimiter)strtok()函数接收两个传入参数,将_String中保存的字符串(待处理字符串),按照_Delimiter中的字符作为分隔符进行分割。如果_String为空,则函数内部保存的SAVE_PTR指针在下一次调用中将作为起始位置。其实这就说明在函数strtok()内部使用了一个静态变量SAVE_PTR指针,用以记原创 2020-06-21 15:07:02 · 28840 阅读 · 5 评论 -
C语言——多线程基础(pthread)
目录1. 线程的定义以及线程的创建1.1 线程和进程的概念1.2 使用pthread_create()函数创建进程2.使用pthread_join()等待线程结束2.1 使用pthread_join()等待线程结束2.1 使用pthread_join()得到线程函数的返回值1. 线程的定义以及线程的创建1.1 线程和进程的概念线程:进程中的一个实体,是CPU调度和分派的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存..原创 2020-05-27 15:15:24 · 28617 阅读 · 4 评论 -
数据结构与算法——插入排序
还是先上算法视频讲解:浙大——数据结构与算法(插入排序)1. 算法实现插入排序作为简单排序的一种,可能是每个人天生就会的算法(谁还没打过扑克牌呢?),就想打扑克整牌的时候,将最小的牌一般会放在手中最左边,一手牌就是个升序排序的过程。直接贴算法://插入排序算法,升序算法void insertSort(int* arr,int num){ int i,j; for(i=1;i<num;i++){//从位置1开始,到数组的最后 int tmp=arr[i];原创 2020-05-21 11:57:27 · 210 阅读 · 0 评论 -
数据结构与算法——快排序
先上浙大陈姥姥的视频连接,我觉得看这个视屏讲的很好。浙大数据结构与算法——快排序原理部分还可以参考《大话数据结构》程杰【著】。1. 算法实现单看陈姥姥的视频,算法实现的伪码描述部分有一点点问题,照着写程序的话会出问题。就是这里for(;;)循环,有点问题是,如果for(;;)跳出之后,此时i可能大于right-1,这样会造成错误,因此最外层的swap应该判断一下i和right-1的大小。代码如下:快排序主函数,提供通用的外部接口。//快排序主函数,提供通用的外部接口void QS原创 2020-05-20 17:46:44 · 184 阅读 · 3 评论 -
C语言——函数指针
1. 函数指针概念1.1 函数指针的声明类似变量在内存中会分配一个空间,函数在内存中也会分配一个空间,这个空间的入口(或者叫首地址)称为函数的地址。用整型指针可以保存整形变量的地址,同样地,用函数指针可以保存函数的地址。我们回顾一下怎么定义一个整型指针:int *p_int;由于整型变量只需要定义变量的类型即可完全规定这个变量的格式(个人理解,变量声明限定了变量的格式,变量定义规定了其内容)。但是对于一个函数来说(将函数也看成一种复杂的变量),函数的格式由哪些东西唯一确定呢?函数返回值原创 2020-05-20 10:20:25 · 3578 阅读 · 1 评论 -
数据结构与算法——链表
1. 线性单链表1.1 抽象定义 类型名 链表。类型属性存储一些列项,运行时确定大小,支持元素的快速插入和删除。类型操作读取任意节点元素;在任意节点位置插入元素;删除已有节点元素;清空整个链表。1.2 代码实现1.2.1 接口定义如下,接口定义在linklist.h文件中://文件名:Linklist.h //主要作用:定义链表的数据接口 #ifndef _LINKLIST_H_#define _LINKLIST_H_#include <原创 2020-05-17 16:31:57 · 451 阅读 · 0 评论 -
KMP模式匹配算法
1. 从朴素的模式匹配算法讲起基本问题:从主串S中,找到T这个字串的位置。例如:主串S:“goodgoole”,字串T:“goole”,得到结果T在S出首次出现的位置在S起始字符开始第五个字符。这种字串定位问题称为“串的模式匹配”朴素算法思路最简单,就是每次从S的第i个字符开始比较,判断S中第i+j字符是否与T中第j个字符相等,相等的话j++,直到i+j超过S的长度或者j超过T的长度,然后返回(i+j超过S的长度:返回-1,表示主串中不存在字串;j超过T的长度:返回I,表示主串中子串的初始位原创 2020-05-10 14:30:52 · 222 阅读 · 0 评论 -
中断处理函数注意事项
中断服务函数由硬件触发,因此不能获得参数,也无法返回值;另一方面,在中断服务函数中使用不可重入的函数,往往会导致问题。原创 2020-05-09 11:49:24 · 9502 阅读 · 4 评论 -
C语言——整型和浮点型混合运算
1. int和double混合运算C语言int和double混合运算时,会自动将int类型的数据转换为double类型的数据,最后得到的结果也是double类型。如下例:double a=4.0/9.0;int b=9*a;//b=3,因为double类型的4.0/9.0的值要小于4.0/9.0的实际值(考虑到有效位数有有限的)上面代码中,b=3,因为double类型的4.0/9.0要小于4.0/9.0的实际值,这是由于浮点型有效位数的限制造成的,所以9*a的值要小于4,赋值给int类型的时原创 2020-05-08 21:39:53 · 29899 阅读 · 3 评论 -
C语言——const关键字
1. const关键字的作用const创建只读变量; 对函数形参使用const以保护数据; const与指针; 非const指针转换为const指针。1.1 const创建只读变量记住一点:const创建的不是常量,而是只读变量,相当于给变量赋予了常量的属性。C语言一般只有(1)字符常量;(2)#define宏定义的常量;(3)enum枚举常量。下面的代码验证了const定义的...原创 2020-05-07 20:56:43 · 296 阅读 · 0 评论 -
C语言——预处理器指令(#define)
1. 明示常量#define使用#define定义明示常量,例如:#define TWO 2 //可以使用注释#define PI 3.1415923 //定义PI#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL //定义一年有多少秒(不考虑闰年)上述宏被称为“类对象宏”,其定义的语法如下:#define PI...原创 2020-05-06 22:16:46 · 894 阅读 · 0 评论 -
线程同步——信号量
参考学习资料:进程线程互斥与同步1.信号量mutex初始化后为0;上锁后+1,解锁后-1;mutex只能串行。信号量可以并行,运行多个线程同时访问共享资源。1.1 头文件#include <semaphore.h>1.2 变量类型//类型名 变量名sem_t sem;1.3 主要函数(1)初始化信号量sem_init(sem_t* s...原创 2020-05-06 11:08:52 · 469 阅读 · 0 评论 -
线程同步——条件变量
1 条件变量】使用读写锁、互斥锁可以阻塞线程,使对临界代码的操作变为原子操作。其临界区代码只有两种状态,锁定和非锁定。而如果需要外部的条件判断之后才执行某些临界区代码,比如经典的生产者-消费者模型,生产者和消费者对资源的使用时互斥的,但是消费者对资源的使用还有一个前提就是资源不为空,但是这个判断互斥锁没法实现。因此需要使用条件变量,在消费者进入临界区并被告知当前无可用资源的时候,阻塞消费者...原创 2020-05-06 10:08:22 · 183 阅读 · 0 评论 -
线程同步——读写锁
参考学习资料:进程线程互斥与同步1. 读写锁1.1 读写锁变量pthread_rwlock_t lock; (一个变量是一把锁)读写锁使用时,一个变量是一把锁。1.2 读写锁类型读锁:对内存做读操作; 写锁:对内存做写操作。1.3 读写锁的特性线程A加读锁成功,又来了三个线程,做读操作,可以加锁成功。(读共享 - 并行处理) 线程A加写锁成功,又来了三个线程,做...原创 2020-05-06 09:35:19 · 357 阅读 · 0 评论 -
线程同步——互斥锁
参考学习资料:进程线程互斥与同步1. 互斥锁(互斥量)1.1 变量类型:互斥锁类型创建一把锁://变量类型 变量名pthread_mutex_t mutex1.2 互斥锁的特点多个线程访问共享数据时是串行的,避免数据混乱。1.3 互斥锁缺点效率低(由于所有的并行都转串行,所以效率比较低)。1.4 互斥锁使用步骤创建互斥锁: pthread...原创 2020-05-06 08:43:53 · 480 阅读 · 0 评论