自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程的概念和基本使用详解

线程:轻量级的进程是进程内部的一条执行序列(一组有序指令),或者说是执行流。一个进程至少有一条线程,即就是main函数所代表的执行序列。称之为主线程。通过线程库可以创建线程——函数线程主线程仅仅是代表进程执行的第一条线程而已,当主线程通过线程库创建出函数线程以后,两个线程就没有任何区别。线程和进程的区别:1、进程是资源分配的单位 线程是CPU调度执行的单位多进程:进程间资源都是独立的,同一进程中的多线程,资源是共享的。线程更加轻便,线程创建、调度、切换效率都比进程高。线程库的使用#includ

2021-12-07 22:16:21 1483 1

原创 柔性数组详解

柔性数组引言概念引言#define MAXLEN 1024typedef struct kd_node{ struct kd_node *left; struct kd_node *right; int dim; unsigned long long data[MAXLEN];}kd_node;在这段代码中,为了存储数据,申请了长度为1024的unsigned long long型数组,若是数据的长度远远小于MAXLEN,这样设计,及其浪费空间。在C99标准中给出了新的设计方法,通过

2021-12-01 20:16:11 1058 1

原创 【C语言】动态内存管理

动态内存管理什么是动态内存?动态内存分配函数malloc什么是动态内存?void fun(){ char strb[1024 * 1024] = {0};}int main(){ char stra[1024 * 10] = {0}; fun(); return 0;}运行时程序崩溃,这是为什么呢?分析编译链接过程,我们知道栈区在函数被调用时分配,用来存放函数的参数值,局部变量等。在window中栈的默认大小时:1M,在visual studio中我们可以设置栈区的大小,在L

2021-12-01 16:58:55 941

原创 【Linux文件操作函数】系统调用

这里写目录标题一级目录open一级目录openopen()函数打开或创建一个文件,函数原型为:#include<fcntl.h>//用于打开一个已存在的文件int open(const char *filename,int flag)//用于新创建一个文件int open(const char *filename, int flag,mode_t mode;filename: 需要打开的文件名flag: 打开文件的方式:O_RDONLY O_WRONLYO_RDWR O

2021-11-29 22:22:16 443

原创 C语言主函数参数|输出缓冲区问题

这里写目录标题C程序的两个问题主函数参数输出缓冲区C程序的两个问题主函数参数1、主函数默认至少接受一个参数,就是执行程序的命令本身。传递参数时,按照空格来区分传递的参数。2、传递的参数的类型,都是字符串,与用户给定的参数类型无关int main(int argc,char *argv[],char *envp[])argc:参数个数argv:字符指针数组,每一个数组元素都是一个字符指针(字符串)传递的参数列表。envp:环境变量int main(int argc,char *argv[]

2021-11-28 18:48:46 188

原创 大小端存储模式的判断与转换

大小端的理解大小端模式的介绍为什么会有大小端存储模式之分大小端模式的判断大小端模式的转换大小端模式的介绍大端模式:是指一个数据的低位字节序的内容放在高地址处,高位字节序存的内容放在低地址处。小端模式:是指一个数据的低位字节序内容存放在低地址处,高位字节序的内容存放在高地址处。例如:0x12345678在内存中的表示形式。大端模式:小端模式为什么会有大小端存储模式之分在计算机系统中,我们是以字节为单位存放数据的,每个地址单元都对应着一个字节,一个字节为8bit。但在C语言中除了 8 bi

2021-11-27 18:50:18 827

原创 共用体(联合体)详解

共用体结构体和共用体的异同点共用体应用结构体和共用体的异同点1、结构体和共用体都可以建立新的数据类型。2、结构体变量的每个数据成员同时被分配了各自独立的存储空间,互相之间没有影响;3、共用体变量的每一个数据成员的起始地址都相同(存储重叠),所有数据成员占用同一段内存,修改一个数据成员会影响其它所有数据成员。4、结构体变量占用的内存大小,大于等于所有数据成员占用内存的总和。(字节对齐)5、共用体变量占用的内存大小,等于最大数据成员占用的内存大小,共用体使用了内存覆盖技术,同一时刻只能保存一个成员的

2021-11-27 11:53:54 536

原创 c语言指针详解3

指针与数组的关系数组名被看做数组的第一个元素在内存中的首地址,(sizeof操作中表示所占内存的大小),数组名在表达式中自动转换为一个指向数组第一个元素的指针常量。#define N 5int main(){ int ar[N] = {12,23,34,45,56}; int size = sizeof(ar);//20 printf("%p \n",ar); printf("%p \n",&ar[0]);}ar是数组第一个元素的地址,ar是数组第一个元素ar[0],ar+1

2021-11-26 21:08:01 101

原创 Linux进程间通信——管道通信详解

进程间通信:管道引言进程间通信管道引言进程是相互独立的,每个进程都有自己的虚拟地址空间,虚拟地址空间通过页表的映射,映射到自己的物理内存上,互不影响。正因为如此,进程间通信就变得很麻烦,操作系统为了使进程间能够通信,会提供一个介质,让多个进程都能够访问,也就是在内存上开辟一块公共资源,让进程在公共资源上交流。进程间通信在Linux系统中,有时候需要多个进程之间相互协作,共同完成某项任务,进程之间或线程之间有时候需要传递信息,有时候需要同步协调彼此工作,则就会出现进程间通信。信号也是进程间通信的一种

2021-11-26 20:46:55 5406

原创 Linux信号的使用

信号1.1概念1.2信号分类1.2信号的产生1.3信号的响应方式修改信号的响应方式信号的发送1.1概念信号:操作系统预先定义好的某些特定的事件,信号可以被产生,也可以被接收。产生和接收的主体都是进程。(一个进程向另一个进程通知某一个事件的发生)。kill -l//查看所有信号1~34为普通信号,不存在(0,32,33号信号),34以上为实时信号Linux系统平台上信号的定义:每个信号都有一个编号和一个宏定义名称,这些宏定义可以在系统调用signal.h找到。常见信号的值及对应功能。

2021-11-25 15:12:23 749

原创 C语言指针详解(2)

指针的运算1、类型对指针加一的影响整型int指针变量加1int main(){ const int n = 5; int arr[n] = {1,2,3,4,5}; int *ip = &arr[0];//&arr for(int i = 0;i < n;i++) { printf("%p => %d \n",ip,*ip); ip = ip + 1; } return 0;}double类型指针加1#define N 5int main

2021-11-21 21:44:00 643

原创 结构体数据成员相对偏移量的计算

struct Node{ char cha; int ia; char chb; double dx; char str[5]; int ib;}

2021-11-21 11:24:19 1136

原创 c语言结构体字节对齐规则

结构体大小struct Node{ char cha; int a; char chb;};int main(){ struct Node nd = {'a',100,'b'}; int size1 = sizeof(nd); int size2 = sizeof(struct Node); int size3 = sizeof nd; printf("%d %d %d \n",size1,size2,size3); return 0;}由于存储变量地址对齐的问题,计算

2021-11-19 21:10:04 1715

原创 C语言指针详解(一)

1、什么是指针?计算机中所有的数据都必须放在内存中,不同类型的数据占用不同的字节,char:1字节,int:4字节,为了可以正确的访问这些数据,必须为每个字节编上号码,每个字节的编号都是唯一的,我们将内存中字节的编号称为地址或指针。对于32位操作系统,程序能够使用的内存为4GB(2^32),最小地址为0x0000 0000,最大地址为:0xFFFF FFFF2、指针变量的定义int *p = &value;*表示这是一个指针变量,int,表示是这个指针变量所指向的类型(整型)。指针是内

2021-11-17 20:24:38 505

原创 数据的存储方式

1、进制转换计算机中的进制有二进制、八进制、十进制、十六进制,十进制是逢十进一,八进制逢八进一,以此类推,x进制逢x进1。二进制、八进制、十六进制转十进制规律是相同的,都是按权求和(10010)2 = (1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0)10(234)8 = (2 * 8^2 + 3 * 8^1 + 4 * 8^0)8(1a2) = (1 * 16^2 + a * 10^1 + 2 * 16^0)16十进制转二进制:(103)10

2021-11-15 20:08:06 3173

原创 顺序栈和链栈的实现

栈:操作受限的线性表栈仅在表尾进行插入或删除操作的线性表,表尾:栈顶(top),表头端:栈底 后进先出void DestroyStack(SeqStack *ps){ assert(ps != NULL); free(ps->base); ps->base = NULL; ps->top = NULL; ps->stacksize = 0;}void ClearStack(SeqStack *ps){ assert(ps != NULL); ps-

2021-11-05 20:30:10 136

原创 单链表的逆置

单链表的逆置实现方法三指针实现由三个指针 pre = NULL , s = NULL , p = head->next;第二步:s = p;第三步:p向后移动 p = p->next;第四步:s->next = pre; s->next = NULL;第五步:pre = s;总体循环移动实现过程:while(p != NULL)代码实现:typedef int ElemType;typedef struct ListNode{ Elemtype d

2021-10-24 16:54:36 233

原创 顺序表基本操作

顺序表基本操作顺序表特点:在逻辑上是连续的,在物理空间上也是连续的;在顺序表中存储数据元素,必须从空间的首位置开始存储,连续存放,不能有空的空间。结构的声明:typedef int Datatypetypedef struct SqList{ Datatype* data//指向存储空间的指针 int length//存储的元素个数 int Listsize//空间的大小 }SqList;方法的声明bool InitSqList(SqList *sq,int init_size)

2021-04-12 14:52:31 147

原创 实现Swap函数,将两个数交换

一个人至少拥有一个梦想,有一个理由去坚强。心若没有栖息的地方,到哪里都是在流浪——三毛自信心深受打击的我,只能来写写笔记了。刚刚对指针做了基础的学习,那么指针的作用在哪里呢,我们就用Swap函数作一下分析。void Swap(int a, int b)//交换不成功{int tmp = a;a = b;b = tmp;}int main(){int a = 10;int b = 20;printf("交换前:%d,%d\n",a,b)Swap(a,b)printf("交换后:%

2020-12-16 14:29:32 9845 7

原创 输出一个整数的位数,并逆序、顺序输出它的每一位数字

//求出整数n是几位数,算法原理:统计丢的次数(/=10)int Count(int n){ if(n==0) { return 1; } int tmp=0; while(n!=0) { n/=10; tmp++;//统计丢的次数 } return tmp;}``//求出整数n是几位数,算法原理:统计丢的次数(/=10)int Count(int n){ if(n==0) { return 1; } int tmp=0; while(n!=0) {

2020-12-09 10:52:30 3113

空空如也

空空如也

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

TA关注的人

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