<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[grooveHong的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/grooveHong</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; grooveHong]]></copyright><item><title><![CDATA[实现cp命令的功能 linux]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/118891106</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/118891106</guid><author>grooveHong</author><pubDate>Mon, 19 Jul 2021 11:10:21 +0800</pubDate><description><![CDATA[**
实现cp命令的功能
**
#include &lt;stdio.h&gt;
#include "teacher.h"

int main(int argc,const char* argv[])
{
	//main函数参数中argc代表了命令行参数的总个数
	//argv代表了每个参数字符串的首地址
    if(3 != argc)
    {
        printf("User:cp src dest\n");
        return 0;
    }
    //以只读方式打开源文件]]></description><category></category></item><item><title><![CDATA[函数指针 回调快速排序 快排 二分查找]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/118579973</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/118579973</guid><author>grooveHong</author><pubDate>Thu, 08 Jul 2021 18:53:52 +0800</pubDate><description><![CDATA[函数指针：
函数返回值(*函数指针名p)(参数列表);
函数指针就是指向函数的指针，里面存储的就是该函数在代码段的位置。
函数指针中储存了函数的首地址，对它解引用就可以执行函数
定义函数指针：
    返回值类型(*指针变量名)(类型1,类型2,...);

举例：
	int(*compar)(const void *, const void *);

定义函数指针强化版本：
    typedef 返回值(*指针名)(类型1 参数名1;类型2 参数名2 ...);
    （此时指针名就是这种类型）
  ]]></description><category></category></item><item><title><![CDATA[数据结构 链表 环形链表 文件中数据用树保存]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/117932066</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/117932066</guid><author>grooveHong</author><pubDate>Tue, 15 Jun 2021 20:07:16 +0800</pubDate><description><![CDATA[常用的数据结构有哪些
表、树、图、栈、队列、数组等。

链表
链表是一种常见的重要的数据结构。
它是动态地进行存储分配的一种结构。
数据元素存储在彼此独立的内存空间中，每个数据元素中增加一个数据项
用于存储其它元素的地址（指针域），用来表示数据元素之间的关系。
链表的优点：
1.插入删除方便且速度快；
2.内存利用率高，不会浪费内存；
3.大小没有固定，拓展很灵活。
链表的缺点:不能随机查找，必须从第一个开始遍历，查找效率低。

判断环形链表
快慢指针法：
	首先创建两个指针1和2，同时指向这个链表的头节点]]></description><category></category></item><item><title><![CDATA[C++小结 面试题 多态 封装 继承 虚函数 纯虚函数]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/117898898</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/117898898</guid><author>grooveHong</author><pubDate>Mon, 14 Jun 2021 10:58:18 +0800</pubDate><description><![CDATA[C++的四个基本特征、什么是多态
抽象、封装、继承、多态。
多态：发出一个指令，系统会根据实际情况执行相应操作，这种特性就叫多态(同一个命令有多种形态)。

解释一下C++中多态是什么
多态：
发出一个指令，系统会根据实际情况执行相应操作，这种特性叫做多态（同一个命令有多种形态）。
编译时多态：具体调用哪个版本的函数是编译器在编译时就能确定。
运行时多态：用虚函数机制实现的，在运行期间动态绑定。

C++的封装继承多态
封装：
把抽象的结构封装成一个类(结构)，并给类的成员函数、成员变量设置相应的访问权限。]]></description><category></category></item><item><title><![CDATA[C语言常见面试题 笔试题 总结 makefile const和#define的区别 地址重叠 Memcpy sizeof和 strlen 大小端转换 堆和栈的区别 内存管理 static，extern]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/117868377</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/117868377</guid><author>grooveHong</author><pubDate>Sun, 13 Jun 2021 10:24:07 +0800</pubDate><description><![CDATA[从.C文件到可执行文件具体流程，指针的作用
具体流程：
1、预处理：把源文件翻译成预处理文件
gcc -E code.c                  显示与处理结果
gcc -E code.c -o code.i         生成以.i 结尾的预处理的文件
2、编译：把预处理文件翻译成汇编文件
gcc -S code.i                  默认生成以.s 结尾的汇编文件
3、汇编：把汇编文件翻译成二进制的目标文件
gcc -c code.s                  默认生]]></description><category></category></item><item><title><![CDATA[字符串处理函数  strlen、strcpy、strcmp、strcat 的实现]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/116208300</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/116208300</guid><author>grooveHong</author><pubDate>Tue, 27 Apr 2021 19:57:20 +0800</pubDate><description><![CDATA[字符串处理函数
strlen、strcpy、strcmp、strcat
#include &lt;stdio.h&gt;
#include &lt;assert.h&gt;

size_t str_len(const char* str)
{
	//if(NULL==str) return 0;
	assert(NULL != str);

	const char* tmp = str;
	while(*tmp) tmp++;
	return tmp - str;
}

char* str_cpy(char]]></description><category></category></item><item><title><![CDATA[c语言32个关键字 内建类型 自建类型 类型限定符 分支 循环 跳转]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/116167331</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/116167331</guid><author>grooveHong</author><pubDate>Mon, 26 Apr 2021 18:51:17 +0800</pubDate><description><![CDATA[c语言32个关键字
数据类型相关：
    内建类型：
        void  char  short  int  long  float  double              7

    自建类型：
        struct  union  enum  sizeof                              4

    类型限定符：
        auto  const  static  volatile  register  extern  typedef  signe]]></description><category></category></item><item><title><![CDATA[STL模板库 常用函数  vector向量容器]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115893810</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115893810</guid><author>grooveHong</author><pubDate>Tue, 20 Apr 2021 09:54:56 +0800</pubDate><description><![CDATA[STL模板库
STL是Standard Template Library缩写，中文名字叫标准模板库，由惠普实验室提供，共有三类内容：
算法：以函数模板形式实现的常用算法，如：max、min、swap、find、sort。
容器：以类模板形式实现的常用数据结构，如：栈、队列、链式表、顺序表、红黑树。
迭代器：它是容器的成员，用于帮助访问容器中的元素，使用方法类似于指针。

常用函数
#include &lt;algorithm&gt;
iterator find( iterator start, iterat]]></description><category></category></item><item><title><![CDATA[什么是模板 为什么使用模板 函数模板]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115769804</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115769804</guid><author>grooveHong</author><pubDate>Fri, 16 Apr 2021 18:54:09 +0800</pubDate><description><![CDATA[一、什么是模板
是一种自动生成代码的技术，这种技术能让程序员在编写代码时不需要考虑数据类型，这种技术被称为泛型编程技术

二、为什么使用模板
1、C/C++是一种静态编程语言(预处理-&gt;编译-&gt;汇编-&gt;链接-&gt;可执行文件)
静态语言的优点就是运行速度比较快，而缺点是实现通用的代码比较麻烦
任务：实现一个通用的快速排序算法
2、借助回调模式实现通用代码，实现难度高，使用也比较麻烦
3、借助宏函数实现通用，类型检查不严格，没有返回值、容易出错
4、借助函数重载实现通用代码，会使代码段增加]]></description><category></category></item><item><title><![CDATA[继承方式与访问属性  多重继承和钻石继承 虚函数、覆盖 多态 虚构造和虚析构  纯虚函数和纯抽象类]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115706937</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115706937</guid><author>grooveHong</author><pubDate>Wed, 14 Apr 2021 19:27:11 +0800</pubDate><description><![CDATA[继承方式与访问属性
访问控制属性决定了成员的访问范围：
    public      可以在任何位置访问
    private     只能在类内访问
    protected   只能在类内和子类中访问
继承方式的影响：
    1、父类的成员能否在子类中访问，是设计父类时访问控制属性决定的；继承方式能决定父类成员被子类继承后，在子类中变成什么样的访问控制属性,见下表：

        父类中属性	    public继承	        provite继承	        private继承
 ]]></description><category></category></item><item><title><![CDATA[继承 继承的语法 继承表 继承的特点 父类 子类]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115674918</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115674918</guid><author>grooveHong</author><pubDate>Tue, 13 Apr 2021 18:15:10 +0800</pubDate><description><![CDATA[一、继承
1、当遇到问题时，先查看现有的类能否解决一部分问题，如果有则通过继承语法，在此类的举出上进行扩展来解决问题，来缩短解决问题的时间(代码复用)
2、当遇到一个复杂问题时，可以先把复杂问题分解成若干个小问题，然后为每个问题设计一个类进行解决，最终通过继承语法把这些类汇总到一个类中，达到解决问题的目的，以此降低解决的难度，同时也可以让多个程序员同时解决该问题

二、继承的语法
1、继承表
    class Test:继承表[继承方式 父类]
    {
        成员变量;
    public]]></description><category></category></item><item><title><![CDATA[操作符函数 运算符函数格式 双目运算符 友元 输入输出运算符 运算类的单目运算符 自变运算符 重载 特殊运算符函数 智能指针]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115655122</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115655122</guid><author>grooveHong</author><pubDate>Tue, 13 Apr 2021 10:05:41 +0800</pubDate><description><![CDATA[一、 操作符函数
在C++中会把运算符当函数处理，一个表达式，其实是调用了很多运算符函数完成计算的；这种特性对内建类型没有什么用处，但是对自建内型数据，却可以进行个性化设计，提高代码的可读性和易用性(如 string 类)
string str;
str += "hehe";
str1 == str2;

运算符函数的格式：
单目运算符：#O 或 O# 会被编译器解释为
    [] O::operator#(void)
    {
        
    }
    返回值不确定，唯一的参数是调用者
全]]></description><category></category></item><item><title><![CDATA[对象的创建和销毁过程  成员函数区别调用的对象 常用成员 常函数 const C/C++中const异同点 空结构体字节]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115495056</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115495056</guid><author>grooveHong</author><pubDate>Wed, 07 Apr 2021 20:32:52 +0800</pubDate><description><![CDATA[一、对象的创建和销毁过程
1、对象的创建过程
    a、给对象划分内存空间(栈、堆)
    b、执行初始化列表
        根据继承表顺序调用父类的构造函数，也可以调用有参构造，类名(参数)
        根据成员的定义顺序调用类类型成员的无参构造函数，也可以调用有参构造，成员名(参数)
        初始化其它成员
    c、执行构造函数，申请资源
2、对象的销毁过程
    a、执行析构函数，释放资源
    b、根据成员的定义逆序调用类类型成员的析构函数
    c、根据继承表顺序逆序调]]></description><category></category></item><item><title><![CDATA[默认形参 内联函数 引用 取别名 指针与引用的相同点和不同点 强制类型转换 面向对象与面向过程 类和对象 访问控制限定符 构造函数 析构函数 初始化列表]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115467083</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115467083</guid><author>grooveHong</author><pubDate>Tue, 06 Apr 2021 18:15:15 +0800</pubDate><description><![CDATA[一、默认形参
1、什么是默认形参
    在C++中可以给函数的参数设置默认值，当函数被调用时调用者提供了实参则使用实参，如果没有提供则使用默认值
2、默认形参要靠右
    如果函数有多个参数，设置了默认形参，默认形参必须要从右到左连续排列
3、只在声明时设置默认形参
    如果函数的声明和定义分开实现，只在函数声明时设置默认形参即可，否则会出现语法错误
4、默认形参可能会影响重载的效果
    如果对函数进行了重载，又设置了默认形参，调用时可能会造成冲突；因此为重载过的函数设置默认形参时一定要慎重

]]></description><category></category></item><item><title><![CDATA[C++ C++与C的区别 C++与C数据类型的不同 名字空间 匿名空间 C++的堆内存管理 函数重载]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115382006</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115382006</guid><author>grooveHong</author><pubDate>Thu, 01 Apr 2021 19:32:56 +0800</pubDate><description><![CDATA[一、C++介绍
本贾尼·尼特芝斯特鲁普，于1979年4月份在贝尔实验室分析UNIX系统分布内核的流量时，特别希望有一种更加模块化的工具，于是在1979年10月开始着手开噶一种新的编程语言，在C语言的基础上增加了面向对象机制，这就是C++，在1983年完成了C++的第一个版。

C++与C的重要区别：
    1、C++完全兼容C的所有内容
    2、支持面向对象的编程思想
    3、支持运算符重载、函数重载的编译时多态机制
    4、泛型编程、模版
    5、支持异常处理
    6、类型检查更严格]]></description><category></category></item><item><title><![CDATA[多路复用 select pselect poll epoll epoll的条件触发和边缘触发]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115360356</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115360356</guid><author>grooveHong</author><pubDate>Wed, 31 Mar 2021 20:46:25 +0800</pubDate><description><![CDATA[多路复用
使用一个进程(且只有主线程)同时监控若干个文件描述符的读写，这种读写模式叫多路复用。
多用于TCP的服务端，用于监控客户端的链接和数据的收发。
优点：不需要频繁的创建、销毁进程，从而节约了内存资源、时间资源，也避免进程之间的竞争、等待。
缺点：单个客户端的任务不能太耗时，否则其他客户端就会感知到。
适合并发量高，但任务短小的情景，如：Web服务器。

select
#include &lt;sys/select.h&gt;
#include &lt;sys/time.h&gt;
#include ]]></description><category></category></item><item><title><![CDATA[TCP网络传输代码 网络通信]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115342122</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115342122</guid><author>grooveHong</author><pubDate>Wed, 31 Mar 2021 09:14:38 +0800</pubDate><description><![CDATA[TCP_CLIENT.C:
#include &lt;stdio.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;string.h&gt;
#include &lt;unistd.h&gt;

int main(int argc,const char* argv[])
{
	//创建s]]></description><category></category></item><item><title><![CDATA[线程管理 POSIX线程 线程函数 pthread 主线程与子线程传参 线程的结束 线程的取消操作 线程分离 线程同步 互斥量 条件变量 死锁问题 死锁的检测]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115254498</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115254498</guid><author>grooveHong</author><pubDate>Fri, 26 Mar 2021 20:33:19 +0800</pubDate><description><![CDATA[线程管理
线程介绍：
线程就是进程中负责执行的部分，是进程内部的控制序列。它是轻量级的，没有自己独立的内存资源、代码段(text)、数据段(静态数据bss、全局数据段data)、堆(heap)、环境变量、命令行参数、文件描述符、信号处理函数、当前工作目录
但是线程拥有独立的栈内存，也就是说它有自己独立的局部变量
 一个进程中至少有一个线程，我们把它叫做主线程，也可以再创建多个线程

注意区别：进程是个资源单位，而线程是个执行单位，线程是进程的一部分，进程中正是有了线程才能动起来

POSIX线程：
    ]]></description><category></category></item><item><title><![CDATA[功能受限的表结构 顺序栈 链式栈 栈的应用 队列 链式队列 队列应用]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115216865</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115216865</guid><author>grooveHong</author><pubDate>Thu, 25 Mar 2021 19:45:01 +0800</pubDate><description><![CDATA[功能受限的表结构
对表结构加以限制、形成特殊的表结构
栈：
只有一个出入口的表结构，先进后出    (FILO-&gt;fast in later on)


顺序栈：
        数据项：
            存储元素的内存首地址
            栈的容量
            栈顶位置
        运算：
            创建、销毁、入栈、出栈、栈空、栈顶    


链式栈：
        数据域：
            栈顶
            节点数量
   ]]></description><category></category></item><item><title><![CDATA[树型结构 概念 表示方法 节点 深度 树的存储 二叉树 二叉树性质]]></title><link>https://blog.youkuaiyun.com/grooveHong/article/details/115161941</link><guid>https://blog.youkuaiyun.com/grooveHong/article/details/115161941</guid><author>grooveHong</author><pubDate>Wed, 24 Mar 2021 09:47:54 +0800</pubDate><description><![CDATA[树型结构
1、树的基本概念
    是一种表示层次关系（一对多）的数据结构
    有且仅有一个特定的节点，该节点没有前驱，被称为根节点
    剩余的n个互不相交的子集，其中的每个子集也都是一棵树

    注意：属性结构具有递归性（树中有树）

2、树的表示方法
    倒悬树、嵌套法、凹凸法

3、树的专业术语
    节点：组成树的基础元素，同时，节点它也是一棵树
    节点的度：该节点子树的数量
    树的度（密度）：树中节点的数量
    树的高度：树的层数
    树的深度：树的最大层次为]]></description><category></category></item></channel></rss>