c语言
most delay
这个作者很懒,什么都没留下…
展开
-
c语言之贪吃蛇(ncurse库)
1.关于ncurse库(1)如果没有ncurse这个库先安装ncurse库sudo apt install libncurses5-dev(2)在编译时后面加上 -lcurses(3)测试代码#include <curses.h>int main(){ char c; initscr();//ncurse界面的初始化函数 printw("this is curses window.\n");//在ncurse模式下的printf原创 2021-09-07 22:24:53 · 600 阅读 · 0 评论 -
什么是状态机(状态机制作锁)
1.有限状态机(FSM)(1)FSM指的是有有限个状态(一般是一个状态变量的值),这个机器同时能从外部接收信号和信息输入,机器在接受到外部输入的信号后会综合当前自身的状态和用户输入的信息,然后机器做出动作,跳转到另一状态。(2)考虑状态机的关键点:当前状态、外部输入、下一个状态2.两种状态机(Moore型和Mealy型)(1)Moore型状态机的特点:输出只与当前状态有关(与输入信号无关)。(2)Mealy型状态机:输出不止与当前状态有关,还与输入信号有关,综合考虑这两个条件过后才决定跳转到那一个原创 2021-08-17 16:35:16 · 418 阅读 · 0 评论 -
内核链表的简介
1.为什么要设计内核链表:(1)在不同的程序当中的链表总体结构是多种多样的,导致我们无法通过一个泛型的、普遍适用于操作函数来访问所有的链表,这就意味着我们设计一个链表就得写一套链表的操作函数。(2)实际上深层次分析会发现,不同的链表虽然这些方法不能通用需要单独写,但实际上内部的方法和思路是相同的,只是函数的局部地区有不同(实际上链表的操作是相同的,而涉及到数据区域的操作时不同的)。(3)鉴于上面两点。内核链表就是把所有链表中操作方法共有的部分提取出来用一套标准方法实现,然后把不同部分留着让具体链表的实原创 2021-08-17 10:44:20 · 142 阅读 · 0 评论 -
双链表的创建插入遍历
1.双链表的创建与插入#include <stdio.h>#include <stdlib.h>#include <string.h>//创建双链表的节点模板struct node{ int data; struct node *pPrev; struct node *pNext;};//创建一个双链表节点函数struct node *creat_node(int data){原创 2021-08-16 14:29:19 · 105 阅读 · 0 评论 -
单链表之逆序
1.单链表的逆序就是将所以节点逆序过来解决思路:先遍历所有节点,然后将第一个节点的pNext指向NULL,将第二个节点的pNext指向原来的第一个节点,也就是pH的pNext,并把头节点的pNext指向头插入过来节点的首地址。#include <stdio.h>#include <string.h>#include <stdlib.h>//构建链表节点struct node{ int data; //有效数据 s原创 2021-08-15 10:23:10 · 1365 阅读 · 0 评论 -
单链表之删除节点
1.删除节点的步骤(1)找到要删除的这个节点:通过遍历来查找节点,从头指针+头节点开始,顺着链表依次将各个节点拿出来,按照一定的方法比对,找到我们要删除的那个节点。(2)删除这个节点(2.1)如果不是尾节点:首先把待删除节点的前一个节点的pNext指向待删除节点的后一个节点的首地址,然后再将摘出来这个节点free掉。(2.2)如果这个节点是尾节点,首先把待删除这个节点的前一个节点的pNext指针指向NULL,然后再将摘出来这个节点free掉。#include <stdio.h>#in原创 2021-08-14 16:39:35 · 8043 阅读 · 0 评论 -
单链表的遍历
1.什么是遍历遍历就是把单链表的各个节点挨个拿出来,一个不能少,也不能重复,追求效率。2.如何遍历单链表(1)分析数据结构的本身特点,然后根据根据它本身的特点制定相应的遍历算法。(2)单链表的特点就是有多个节点组成,头指针+头结点为整个链表的开始,最后一个节点的特点是它内部的pNext指针值为NULL。从起点到结尾中间由各个节点内部的pNext指针来挂接,并且路径只有一条。(3)遍历方法:从头指针+头节点开始,顺着指针依次访问各个节点,取出各个节点的数据,直到最后一个节点,结束返回。#inclu原创 2021-08-14 15:31:56 · 17873 阅读 · 2 评论 -
链表的节点插入
1.在链表的尾部插入新节点#include <stdio.h>#include <string.h>#include <stdlib.h>//构建链表节点struct node{ int data; //有效数据 struct node *pNext; //指向下一个节点的指针};//函数功能,创建链表节点//返回值:指针,指向我们本函数新创建的一个节点的首地址struct node *cre原创 2021-08-13 15:21:25 · 4012 阅读 · 0 评论 -
结构体内嵌函数指针实现分层
首先创建一个文件夹包含三个文件上层文件(frm.c)下层文件(cal.c)头文件(cal.h)1.上层函数编写#include <stdio.h>#include "cal.h"typedef int (*func)(int,int);int lat(const struct cal_t *p){ return p->p1(p->a,p->b);}2.下层文件编写#include <stdio.h>#include <原创 2021-07-30 21:11:07 · 149 阅读 · 0 评论 -
链表的概念及创建
1.链表是由如干个节点所组成的(链表的各个节点结构是完全相似的),节点是由有效数据和指针组成的,有效数据区是用来储存数据的,指针是用来指向下一个节点的首地址,从而构成链表。2.链表是用来解决数组的大小不能动态扩展的问题,灵活性比数组好,和数组一样也是用来存储数据的,链表需要分配多少个动态数据分配多少个,不占用额外内存。3.单链表的实现(1)单链表的节点构成有效数据部分,和指针部分(2)定义的structnode只是一个结构体,本生没有变量生成,也不占用内存,结构体定义相当于为链表节点定义了一个模原创 2021-08-12 17:29:49 · 516 阅读 · 0 评论 -
程序调试的DEBUG宏
debug宏的实现原理(1)DEBUG宏大概的原理是:#ifdef DEBUG#define dbg() printf()#else#define dbg()#endif(2)工作方式是:如果我们要输出DEBUG版本则在条件编译语句前加上#define DEBUG即可,这样程序中的调试语句dbg()就会被替换成printf从而输出;如果我们要输出RELEASE版本则去掉#define DEBUG,则dbg()就会被替换成空,则程序中所有的dbg()语句直接蒸发了,这样的程序编译时就会生成没有原创 2021-08-12 15:30:06 · 939 阅读 · 0 评论 -
main函数的返回值及传参
1.main函数的返回值是返回给调用它的父进程也就是执行它的可执行文件。这个父进程调用子进程来执行一个任务,然后子进程执行完成后通过main函数的返回值返回给父进程一个答复,这个答复来表示子进程执行的结果是正确还是错误(0表示成功,负数表示失败)(1)用shell脚本执行程序可以获取获取程序的返回值创建shell脚本:vi return.sh#!/bin/sh./a.outecho $? #$?表示./a.out的返回值执行shell脚本:source return.sh编写一个简单的m原创 2021-08-11 22:26:53 · 3318 阅读 · 0 评论 -
什么是操作系统
1.操作系统的代码本身不参与生产价值,它主要的作用是管理所有资源,它为各种应用程序提供服务和资源调配。2.操作系统的调用通道:API,当应用程序需要使用系统资源,就会通过API向操作系统发送请求,然后操作系统响应,帮助应用程序执行功能。3.C库函数和API的关系(1)单纯的API是及简单没有任何封装的服务参数,这些函数应用程序是可用的,但是不太好用。应用程序为了好用,就对API进行了2次封装,于是就变成了库函数。(2)有时完成一个功能API和库函数都能完成,譬如读写文件API的接口是open wri原创 2021-08-11 17:06:39 · 67 阅读 · 0 评论 -
常见的字符串函数及作用(持续更新中)
都包含头文件string.h:memcpy: void *memcpy(void *dest, const void *src, size_t n);它的功能是从src的开始位置拷贝n个字节的数据到dest。如果dest存在数据,将会被覆盖。memcpy函数的返回值是dest的指针。[memcpy](https://blog.csdn.net/e_one/article/details/80676166)memmove:void *memmove(void *dest, const void *原创 2021-08-11 16:09:21 · 356 阅读 · 0 评论 -
函数库的使用与制作(静态库和动态库)
1.函数库就是事先写好的函数的集合2.作用:供程序员复用3.函数库的提供形式有两种:(1)动态链接库.so文件(效率相对于静态链接库更高,它本身不将库函数的代码段链接到可执行程序,只是做个标记,当程序执行时在去将这个库加载进内存中,并且在一次调用该库的时候直接加载到第一次执行的地方去执行,相当于静态库大大减小了内存的消耗)。(2)静态链接库.a文件(是程序员只编译不连接形成.o的目标文件,然后用ar工具将.o文件归档成.a的归档文件(又叫静态链接库文件)是二进制的无法看到原文件,用户拿到.o和.h文原创 2021-08-10 15:29:56 · 468 阅读 · 0 评论 -
递归函数的理解
通过两个函数来了解递归函数:#include <stdio.h>/*int digui(int n){ printf("递归前n = %d\n",n); if(n > 1) { digui(n-1); //递归函数存在栈中 }else{ printf("递归完n = %d\n",n); } printf("递归后n原创 2021-08-09 16:24:55 · 62 阅读 · 0 评论 -
c语言预处理的定义与使用
1.预处理理论源码.c–>(预处理)–>预处理过的.c文件(.i)–>(编译)–>汇编文件.s–>(汇编)–>目标文件.o–>(链接)–>elf可执行文件2…编译器本生目的是编译源代码,将c的源代码转换成.s的汇编代码。编译器聚集核心功能后。就剥离了一些非核心的功能到预处理器去。(1)gcc编译时可以给一些参数做一些设置,譬如gcc xx.c -o xx可以指定可执行文件的名称,譬如gcc xx.c -c -o xx.o可以指定之编译不连接,也可以生成.原创 2021-08-07 20:16:08 · 169 阅读 · 0 评论 -
offsetof宏和continer_of宏
1.offsetof宏求结构体内元素的偏移值#include <stdio.h>struct mystruct{ char a; int b; short c;};#define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)int main(void){ struct mystruct s1; printf("s1.a的地址原创 2021-08-07 17:37:13 · 94 阅读 · 0 评论 -
typedef与const 混合使用的注意事项
include <stdio.h>typedef int * pInt;typedef const int *pcInt;int main(void){ int a = 11; int b = 22; int c = 33; int d = 44; const pInt p1 = &a; //const int *p1(按理说p1指向的内容是不可变的) *p1 = 12原创 2021-08-01 16:44:15 · 260 阅读 · 0 评论 -
函数指针的使用
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef int (func)(int,int); //定义一个int ()(int,int)的函数funcint add(int a,int b){return a+b;}int sub(int a,int b){return a-b;}int mul(int a,int b){return a*b;}int dev(in原创 2021-07-30 16:13:48 · 55 阅读 · 0 评论 -
字符串和字符数组
一段简单的代码说明:字符串和字符串数组是两种完全不同的东西本质差异:(1)字符数组 char a[] = “linux”:来说,定义了一个数组a,右值“linux”本身只存在于编译器中,编译器将它用来初始化数组a过后弃用相当于char a[] = {‘l’,‘i’,‘n’,‘u’,‘x’,’\0’};(它自带内存空间,可以用来存东西)(2)字符串char *p = “linux”;定义了一个字符指针p,p占4字节,分配在栈上,同时还定义了一个字符串“linux”,分配在代码段。然后把代码段中的字符串的原创 2021-08-03 21:29:17 · 77 阅读 · 0 评论 -
程序与内存
1.三种内存来源:栈(stack)、堆(heap)、数据区(.data)1.1栈的详解(局部变量不初始化分配在栈内)运用是自动分配&自动回收:栈是自动管理的。反复使用:占内存在程序中其实就是那一块空间,程序反复使用这一空间。脏内存:栈内存由于反复使用,每次使用后程序不会去清理,因此分配到时保留原来的值。临时性(函数不能返回栈变量的指针):栈会溢出:...原创 2021-08-03 10:33:41 · 170 阅读 · 0 评论 -
结构体的使用与对齐
1.结构体用指针表示#include <stdio.h>struct s{ char c; int b;};int main(void){ struct s s1; s1.c = 't'; s1.b = 12; printf("len = %ld\n",sizeof(struct s)); char *p1 = (char *)(&s1); //将结构体用指原创 2021-08-04 20:53:41 · 69 阅读 · 0 评论 -
指针与二维数组
重点是搞清楚二维数组的一维和二维通过代码理解:1 #include <stdio.h>23 int main(void)4 {5 /*6 * 指针指向二维数组的数组名7 //int (p)[55]; 这里数组值不等于5后面两个printf出现错误8 int (p)[5];9 int a[2][5]={{1,2,3,4,5},{6,7,8,9,10}};1011原创 2021-08-02 10:59:19 · 68 阅读 · 0 评论 -
宏定义的注意事项
#include <stdio.h>//#define N 10//#define X(a,b) ((a)+(b)) //不加括号很有可能出错//#define MAX(a,b) (((a)>(b)) ? (a) : (b)) //三目运算求最大值//#define year_To_Sec (365*24*60*60) //求一年有多少秒错误写法超过取值范围//#define year_To_Sec (365*24*60*60)UL //求一原创 2021-08-08 11:00:33 · 128 阅读 · 0 评论