- 博客(27)
- 收藏
- 关注
原创 指针函数和函数指针的区别
1、指针函数:是一个函数,返回值是一个指针,要注意返回的这个指针不能是局部变量。可以使用static修饰的变量或者申请堆空间的方式等等。2、函数指针:是一个指针,是一个指向函数的指针,是调用函数的入口。#include <stdio.h>int *func(int a, char *b){ printf("成功进入%s函数体-----\n",__func__); static int c = 1; return &c;}int main(int
2022-01-05 11:36:25 2437
原创 指针数组和数组指针区别
1、指针数组:主语是数组,是一个数组,数组里面每个元素都是指针(* arr[ ]);常用来存放指针用的。2、数组指针:主语是指针,是一个指针,数组指针指向的是数组中的一个具体元素,而不是整个数组,只要是一个指针指向了数组,我们就称之为数组指针。常用于遍历数组。int arr[]={1,3,5,7,9};int len = sizeof(arr)/sizeof(int);int *p = arr; //p就是一个数组指针for(int i = 0;i < len;i++){ p
2022-01-05 11:13:54 5234
原创 (常指针、指针常量)和(常目标指针、常量指针)的区分
一、(常指针、指针常量)和(常目标指针、常量指针)的区分1、常指针、指针常量:这两个是同一个意思,都是在修饰指针,主语为指针,说指针是一个常量(*const p),指针的指向不能改变。例子:数组名为指针常量,数组名代表数组首地址,指针指向不能改变。2、常目标指针、常量指针:都是在修饰常量,主语是目标,说目标是常量(const *p),*p的内容不能被修改。例子:存储在只读存储区的字符串,该字符串是一个常量,内容不能被修改。3.附加题:定义一个指向常量的指针常量:..
2022-01-05 11:04:51 1468
原创 x&(x-1)、x|(x+1)妙用以及判断一个数为2的几次幂,判断一个数是否为2的几次幂
一、x&(x-1)的妙用:将x转化为2进制,看含有的1的个数。注:每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。int func(x) { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; ...
2022-01-04 10:17:52 372
原创 TCP的三次握手和四次挥手
TCP协议在建立连接的时候需要进行三次握手,在断开连接的时候需要进行四次挥手1)由于TCP连接是全双工的,因此在断开的时候需要每一个方向都单独进行关闭,首先进行关闭的一方,将执行主动关闭,而另一方将执行的是被动关闭下面我们来讲一讲,四次挥手的交互过程:1.第一次挥手就是,tcp客户端发送一个FIN包,用来关闭客户端到服务器端的数据传送。2.第二次挥手就是服务器,收到了这个FIN包,他发回一个ACK确认包,确认序号就是收到那个FIN包的序号加1。3.第三次挥手就是服务器端关闭到客户端的连接,服务器会发
2021-12-29 20:17:28 960
原创 volatile的作用
一、volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。二、简单地说就是防止编译器对代码进行优化。比如如下程序:1)XBYTE[2]=0x55;2)XBYTE[2]=0x56;3)XBYTE[2]=0x57;4)XBYTE[2]=0x58;对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入vola
2021-12-29 19:23:21 772
原创 malloc/free和new/delete区别
有以下区别:malloc和free是库函数,用字节申请内存 new和delete是关键字,用类型申请内存 malloc和free是单纯的对堆内存进行申请和释放 对于基本类型new关键字会对内存进行初始化 对于类型new和delete还负责构造函数和拆构函数的调用...
2021-12-29 19:05:43 602
原创 信号的响应与阻塞
1. 信号的阻塞集,是否可以被子进程继承? // 答案:可以!2. 已阻塞的信号(挂起的信号),是否可以被子进程继承? // 答案:挂起的信号,不能被继承。3. 同一个信号,是否能被多次阻塞(多次挂起)呢? // 答案:根据信号分类而定。 // 非实时信号(第1~31号):不能多次挂起,只能1次,多个相同信号会被直接丢弃,所以也称为不可靠信号。 // 实时信号(第34~64号):可以多次挂起。所有挂起的信号都会依次响应,不会丢弃,所以也称为可靠信号。 ...
2021-12-29 19:03:03 274
原创 网络编程的广播和组播
广播1)什么是广播 单播:数据包发送方式只有一个接受方 广播:同时发给局域网中的所有主机2)前面我们所写的所有代码都只能实现点对点的通信,除非使用多线程或多进程的手段来实现一对多的通信效果。如何不使用进程线程的手段来实现给局域网中所有的主机发送一对多的广播效果呢?可以使用Linux中的广播机制。3)特点:不需要循环给每一个主机发送数据,而是在同一个局域网中所有的主机都能收到广播信息 只需要向广播地址发送数据即可,整个局域网中的主机都能收到该信息 只有UDP协议才支持这个骚...
2021-12-29 16:51:27 954
原创 快速排序算法
思路:1)在你要排列的数中,确定一个基准点k,确定你要排序的数组的low下标、high下标2)第一轮排序要达到使得k左边的数都小于k,k右边的数都大于k的效果。3)递归分裂数据,分成左右两边进行排序,循环操作上面两步,退出条件为low>=high#include <stdio.h>void quickSort(int arr[], int low, int high){ if (low < high)//递归的退出条件,当low >= high,
2021-12-24 10:09:38 618
原创 在6818开发板上显示bmp图片的基本步骤
我总结为以下四步:1)打开液晶屏文件、打开bmp图片文件、完成液晶屏内存映射2)读取bmp图片文件到临时数组temp,等待处理数组里面的数据。3)处理数据、映射到液晶屏上,此处是bmp图片算法:将bmp图片每个像素点BGR数据转化为ARGB。 上下180度颠倒 ,并且直接写入液晶屏显示。4)关闭液晶屏、bmp图片文件。#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#
2021-12-23 20:10:06 6615 2
原创 宏定义的内容是怎么被处理的
1)直接文本替换,不做任何语法判断,更不做任何中间运算。2)宏在编译的第一个阶段(预处理阶段)被替换掉,运行中不存在宏。3)宏将在所有出现它的地方展开,虽然浪费了内存空间,但是节约了切换函数的时间。...
2021-12-23 19:29:21 353
原创 什么是线程同步和互斥
线程同步:每个线程之间按预定的先后次序进行运行,协同、协助、互相配合。可以理解成“你说完,我再做”。有了线程同步,每个线程才不是自己做自己的事情,而是协同完成某件大事。线程互斥:当有若干个线程访问同一块资源时,规定同一时间只有一个线程可以得到访问权,其它线程需要等占用资源者释放该资源才可以申请访问。线程互斥可以看成是一种特殊的线程同步。...
2021-12-23 19:24:51 1857
原创 C语言代码编译的四个过程
一、预处理 所谓的预处理就是解释源程序当中的所有的预处理指令,那些诸如#include、#define、#if 等以井号’#’开头的语句就是预处理指令。这些工作包括我们熟悉的诸如文件包含、宏定义、条件编译等等。gcc hello.c -o hello.i -E // -o 执行输出的文件名加上一个编译选项 -E 就可以使得 GCC 在进行完第一阶段的预处理之后停下来,生成一个默认后缀名为.i 的文本文件。二、编译 编译阶段是四个阶段中最为复杂的阶段,它...
2021-12-23 19:22:52 1959
原创 什么是进程,线程?也就是问彼此有什么区别?
一、从四个方面说什么是进程,线程:1)调度:进程是系统资源分配的基本实体;线程是CPU调度的基本单位,线程是一个进程的内部资源,是linux中最小资源单位。2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。二、如何选择该用线程、还是该用进程原则:安全稳定选进
2021-12-23 19:05:12 875
原创 互斥锁、读写锁和条件变量的理解
一、互斥锁是用来干嘛的?1)我对互斥锁的理解:互斥锁平时多作用于线程间对于共享资源的协调处理,一个共享资源在任意时刻最多只能被一个线程访问,否则很可能会出现数据践踏,所以我们要让线程间互斥,那我们就上一把锁。2)互斥锁的作用:当访问同一片内存资源时,只能够让一个线程进行操作。防止因为两个或者以上线程同时访问某一片内存空间而导致出现数据践踏。3)什么场合使用互斥锁:当多个线程要同时访问同一片内存时,使用互斥锁。二、为什么要有读写锁?读写锁是用来干嘛的?1)就像一场电影一样,肯定是好多人一起看
2021-12-20 19:37:19 422
原创 进程间的通信方式(IPC)
今天有想法来讲述一下进程间的通信方式,我对该进程方式做了如下总结:其包含的通信方式有如下五种方式,你了解几种:1)管道:匿名管道:作用于亲缘间通信。 具名管道:作用于一对一、多对一的通信。2)套接字socket:适用于跨网络的进程间通信3)信号:异步通信方式4)system-v IPC对象:消息队列:带标识的管道间的信息传输 共享内存:效率最高的通信方式,直接对内存进行操作 信号量组:信号灯,协调多进程或多线程间的执行次序5)POSIX 信号量POSIX有名信号量:适用
2021-12-20 18:52:38 148
原创 内敛函数的理解
一、定义定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.目的:引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。就是个空间代价换时间的节省。二、与宏函数的差异类似于宏函数的作用,但是有区别:1)宏函数缺陷 1:需要将实现“加 括号”,以保证优先级的完整性2)宏函数缺陷 2:即使加了括号,有些情况,
2021-12-02 21:29:23 882
原创 随机数(rand)和随机数种子(srand)的理解
实际开发应用时,我们代码中有可能会使用到随机数。所以今天来看看随机数是怎么生成的。一、首先rand函数可以用来产生一个数,它具备这种功能。rand相关的头文件为#include<stdlib.h>rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。rand()返回一随机数值的范围在0至RAND_MAX 间。RAND_MAX的范围最少是在32767之间(int),用unsigned int 双字节是65535,四字节是429496
2021-12-01 21:18:46 14100 1
原创 谈谈你对命名空间的理解:
1)namespace命名空间的存在是为了实现在同一个工程中,通过使用命名空间可以实现,同一变量名的多次定义而不报错。2)可以使得代码模块化。将逻辑相关的标识符组织起来,系统更加整洁、清楚;3)随着工程量的增加,变量命名上避免不了出现重名,主要原因是:为了防止名称冲突(在不同的命名空间中,即使有两个相同的变量名,也是两个不同的变量),在实际工作中,我们基本都使用标准命名空间。4)命名空间只能在全局范围内进行定义,不可以定义在函数内部。5)在命名空间内,可以用于存放变量,函数,结构体,类,同时也可以嵌
2021-11-30 21:27:35 1003
原创 线程和进程的区别:
1)进程是系统资源分配的基本实体,而线程是cpu调度的基本单位。2)线程是一个进程的内部资源,线程是Linux中最小资源单位。3)进程关闭,对应里面的线程也会关闭,而线程关闭,他所在的进程不一定会关闭。4)一个进程中的多个线程只占用一个PCB资源,而多个进程占用了多个PCB资源,使用线程操作可以大大节省内存资源。...
2021-11-30 09:05:55 149
原创 ifndef的作用+<filename.h>和“filename.h“的区别+const的作用
1.ifndef的作用防止头文件重复包含和编译2.<filename.h>和"filename.h"的区别#include<filename.h>系统检索头文件时 会先从系统文件里开始找,再找其他地方。用于系统文件较快。#include"filename.h"系统检索头文件时先从程序所处目录开始查找。用于自定义文件较快。3.const的作用1)const可以修饰变量,参数,返回值,成员函数。const可以提高程序的健壮性。2)const+成员函数。任何不修改数据成员
2021-11-25 20:35:11 241
原创 函数重载的理解
重载函数的定义:在相同的声明域中的函数名相同的,而参数表不同的,即通过函数的参数表而唯一标识并且来区分函数的一种特殊的函数。重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。函数重载条件:1)函数名称必须相同。2)参数列表必须不同(个数不同、类型不同、参数
2021-11-24 20:43:36 1255
原创 对宏定义,条件编译,typedef的理解
宏定义:又叫宏替换,在代码编译的预处理阶段。目的为了增强代码可读性,减少/节省函数调用成本。条件编译:有选择的编译,在代码编译的预处理阶段。类似开关的作用,用来控制某个模块,某个函数是否可以执行。适用的场景是存在真假的判断条件,查看标识符是否被定义。在现实的工程项目中会使用大量的条件编译。比如说通过条件编译来使用各个不同的硬件平台;通过条件编译来实现平台和产品线管理;通过条件编译来区分正式版本和调试版本等等。typedef:1)typedef 仅限于为数据类型定义符号名称,#define 不仅可以.
2021-11-23 20:19:39 724
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人