- 博客(35)
- 收藏
- 关注
原创 用C语言模拟实现C++的继承和多态特性
一、我们知道,C语言是一种面向过程的编程语言,而C++是一款在它的语法基础上改进的面向对象的编程语言(1)面向过程与面向对象的区别:①从设计方法角度看: ▶面向过程程序设计方法是用函数(即算法过程)对数据进行操作,但又将函数与其操作的数据分离开来。 ▶面向对象程序设计方法是将对象的属性数据和对属性数据的操作封装在一起,作为一个整体来处理。 ②从维护角度看: ▶面向过程程序设计以过程...
2018-08-16 21:33:44
336
原创 C++中的继承
继承继承是面向对象程序设计中使代码可以复用的重要手段,它允许程序员在原有类特性的基础上进行扩展增加功能。这样产生的新的类叫派生类。 继承体现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。格式class DerivedClassName : access_label BaseClassName 派生类名字 : 继承权限 父类名字...
2018-08-10 10:47:56
252
原创 C++类和对象
类 class/struct通常由一个或多个成员函数组成,这些成员哈数操作属于该类的某个特定对象的属性。在类的定义中属性表示为变量。这样的变量称为数据成员,声明在类的定义之内,但是在所有类的成员函数的定义体之外。可以说类是数据(成员变量)+程序(成员函数)的封装。一、成员访问说明符 public、private、protected1. public 可以从类外部直接访问,prote...
2018-07-30 15:54:39
822
1
原创 内核线程、轻量级进程、用户线程的对比
线程与进程的概念在现代操作系统中,进程支持多线程。进程是资源管理的最小单元;线程是程序执行的最小单元。即线程作为调度和分配的基本单位,进程作为资源分配的基本单位。一个进程的组成实体可以分为两大部分:线程集和资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。线程概念的产生传统单线程进程的缺点现...
2018-07-27 11:03:53
1317
原创 C++入门
现代C++语言可以看做是三部分组成的:低级语言,大部分继承自C语言现代高级语言特性,允许我们定义自己的类型以及组织大规模程序和系统标准库,它利用高级特性来提供有用的数据结构和算法。关于C++的发展史在网上可以找到很多,这里就不再提了。这篇博客是基础C语言的基础上来学习C++的。一、C++关键字(C98标准)二、C++输入输出学习每个新语言的开始都是由hell...
2018-07-25 09:42:02
246
原创 反转字符串
第一次看到这个题目,想到最简单、最直觉的解法就是:遍历字符串,将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环,即可,代码如下:char* reverseString(char* s) { int sz = strlen(s); int i = 0, j = sz - 1; char c; for(i,j; i<j; i++,j--) ...
2018-07-24 13:12:07
1638
原创 进程和程序的区别
进程的定义:“进程”是操作系统的最基本、最重要的概念之一。但迄今为止对这一概念还没有一个确切的统一的描述。下面给出几种对进程的定义描述。进程是程序的一次执行。进程是可以并行执行的计算。进程是一个程序与其使用的数据在处理机上顺序执行时发生的活动。进程是程序在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位。进程的特征:动态性:是程序的一次执行;并发性:进程是可以并发执行;独立性...
2018-07-23 14:10:52
701
原创 Linux里ipcs -q/m/s于ipcrm -q/m/s的使用
进程间通信概述进程间通信有如下的目的:1、数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间;2、共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到;3、通知事件,一个进程需要向另一个或一组进程发送消息,通知它们发生了某件事情;4、资源共享,多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制;5、进程控制,有些进程...
2018-07-19 11:09:33
819
原创 文件操作的库函数
// 读文件--从文件中读count个size大的字段 返回实际读取的字节size_t fread(void *buffer, size_t size, size_t count, FILE *stream);// 写文件--向文件中写入count个size大的字段 返回实际写入的字节size_t fwrite(const void* buffer, size_t size, size...
2018-07-19 10:49:29
746
原创 二进制文件和文本文件的区别
二进制文件和文本文件的区别从文件编码的方式区别,文件可分为ASCII码文件和二进制码文件两种。ASCII码文件就是文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用来存放对应的ASCII码。如5432就是5432,占4个字节。由于是按照字符显示因此人可以看懂。二进制文件就是按照二进制的编码方式来存放文件的。例如数字5432就是 0101 0100 0011 0010,只占2个字节。...
2018-07-19 10:47:38
3143
1
原创 检测一个文件是否读到结尾
如何检测一个文件是否读到结尾feof函数可以检测当前文件流上的文件结束标志,判断是否读到了文件结尾。 int feof(FILE* stream); stream: 文件流指针 返回值: 返回1 检测到文件结束标示, 否则返回0EOF是 End Of File 的缩写,是C语言中标准库中定义的宏,定义为:#define EOF (-1)。 EOF的值为-1,是 int 类型数据,在...
2018-07-19 10:46:41
5655
原创 进程间通信--pipe/msgqueue/sems/shm
IPC inter-process communication进程间通信是指在不同进程之间传播或交换信息 进程间通信可分为以下几类管道(匿名管道和命名管道)system IPC 消息队列(用于数据传输)共享内存(用于数据共享)信号量(用于事件通知)POSIX IPC 消息队列共享内存互斥量条件变量信号量读写锁主要介绍常用的如管道、消息队列、信号量、共享内存这...
2018-07-17 15:08:35
726
原创 进程的同步与互斥概念原理
进程同步是一个操作系统级别的概念,是在多道程序的环境下,存在着不同的制约关系,为了协调这种互相制约的关系,实现资源共享和进程协作,从而避免进程之间的冲突,引入了进程同步。临界资源在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。但对于某些资源来说,其在同一时间只能被一个进程所占用。这些一次只能被一个进程所占用的资源...
2018-07-17 11:56:56
19111
2
原创 对比顺序表和链表
顺序表和链表都属于线性表。顺序表:用一段地址连续的存储空间依次存储数据的线性结构。 优点:查找速度高,可以通过下标直接访问。 在内存中更集中,统一申请/释放,不会造成太多的内存碎片。 对CPU cache更友好。 缺点:插入和删除比较慢。 (比如插入一个元素时,需要把表内元素全部向后移动)链表:一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,每个存储单元称为一个...
2018-07-16 14:28:11
590
原创 ##Linux## 编写简单add/sub/mul/div函数封装为静/动态库
库是什么本质上来说,库是一种可执行代码的二进制形式,可以被操作系统直接载入内存执行。Linux下的库Linux下分为静态库和动态库,这两种库都是可以通过.o文件生成的,也是可以直接使用的。静态库 静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名。 链接时间: 静态库的代码是在编译过程中被载入程序中。 链接方式:静态库...
2018-07-16 11:55:25
433
原创 时间复杂度和空间复杂度
时间复杂度概念:算法的最坏运行情况。(执行基本操作的次数) 即:任意输入规模N,算法的最长运行时间。选最坏运行情况的理由: 一个算法的最坏情况的运行时间是在任意输入下的运行时间上界 对于某些算法,最坏的情况出现较频繁 大体上平均情况和最坏情况一样差时间复杂度的表示–大O渐进表示法 O(n)的计算方法: 用常数1取代所有加法常数 只保留最高阶项 最高阶的系数改为1空...
2018-07-15 11:50:00
172
1
原创 open/read/write/close等文件相关的系统接口
一、open/read/write/closeopen 函数原型: int open(const char* pathname, int flags); //openint open(const char* pathname, int flags, mode_t mode); //create作文件打开函数时 参数: pathname: 要打开的文件名 f...
2018-07-15 11:39:25
230
1
原创 popen/system和fork的区别
我们都知道fork和vfork可以创建新进程,但是创建新进程的方法并不只有这两个,这篇博客会介绍两个也可以创建新进程的函数:popen和system。popen()函数 函数原型:FILE * popen ( const char * command, const char * type ); int pclose ( FILE * stream );作用:popen()会...
2018-07-12 20:58:05
392
原创 简单的自主shell编写
我们打开一个终端的时候,我们可以在上面输入各种命令,从而与终端实现互动。可以发现,每当一个指令的执行结束后,终端会等待我们的下一条指令的输入。 这就类似于我们写了一个死循环,一直在等待着命令的输入。当有一条指令输入时,创建子进程并将子进程替换为命令,执行子进程并且父进程等待子进程的执行结束,从而实现交互。执行完后继续等待下一条指令到达。 要实现自主shell,我们主要在循环里要完成以...
2018-07-12 20:42:27
293
原创 malloc函数的实现原理
malloc—动态内存分配malloc是我们在动态分配内存时常使用到的一个函数,malloc需要和free函数搭配使用。同时动态内存分配函数还有如calloc、realloc,同时动态分配的内存都在堆上。在MSDN中,malloc的作用是开辟一个内存块。函数原型 void *malloc(size_t size);size是开辟的内存所占多少字节。返回类型是void* 型(未确...
2018-07-12 19:26:32
2037
原创 C语言思维导图
学完C语言,感觉需要用图的方式总结出来,这篇思维导图主要包括了变量、数组、指针、函数等C语言里非常重要的组成部分。绘图软件:Xmind
2018-07-12 19:20:35
1886
原创 Linux里的task_struct结构
task_struct —-linux里的PCB(process control block)PID 标识符:本进程唯一的,可区别与其他进程状态:当前进程处于何种状态优先级:进程的优先级程序计数器:要执行的下一条指令地址内存指针上下文数据I/O状态信息记账信息其他信息...
2018-07-10 18:27:32
203
原创 进程的调度算法
进程的调度在操作系统中是非常重要的一环,进程的常用调度算法有以下几种。 这篇博客主要讲解各种算法的优缺点先来先服务(FCFS,first come first served) 1. 易于理解实现简单,用一个队列就可以,也很公平 2. 不利于短进程,不利于i/o繁忙的进程最短作业优先(SJF,short job first) 1. ...
2018-07-10 18:24:46
197
原创 Linux下重要目录及指令
1.Linux下的重要目录/proc, /sys, /SElinux, /bin, /usr/lib, /usr/local, /var, /tmp/proc:proc文件系统,存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程信息,甚至可以通过更改其中某些文件来改变内核的运行状态。(process)/sys:可以通过对sys文件系统访问Lin...
2018-07-10 18:18:52
210
原创 C语言自定义类型浅析
C语言的自定义类型有三种:结构体、枚举、联合一、结构体1.定义:结构体是一些称为成员变量的值的集合,结构里的每个成员可以是不同类型的变量。2.声明struct tag{ member-list; //成员列表}variable-list;例如描述一个学生:struct Stu{ char name[20];//名字 int age; c...
2018-05-13 20:34:16
468
原创 浅析函数指针及函数指针数组
一、函数指针一、定义 函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。二、声明方法void test(){ printf("hello world\n");}int main(){ printf("%p\n",test); printf(...
2018-04-26 16:19:55
163
原创 指针数组、数组指针分析
指针数组和数组指针一、什么是指针数组?首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“存放数组的指针”。二、什么是数组指针?首先它是一个指针,它指向一个数组。在32位系统下永远占4个字节,它指向的数组占多少字节由该数组决定,与该数组指针无关。它是“指向数组的指针”。三、指针数组和数组指针区分int *p1[10];int (*p2)[1...
2018-04-26 15:17:38
204
原创 模拟实现strstr
strstr也是在字符串函数中比较常见的一个简单函数,其功能是查找一个字符串是不是另一个字符串的子串,我们可以也尝试模拟实现strstr。首先知道strstr的函数类型和参数char *strstr( const char *str1, const char *str2 );下来需要实现:1.检测字符串的安全性,即是否为空。 2.str1的字符逐个递增,并与str2整串进行...
2018-04-22 23:57:08
217
原创 可变参数列表源码的剖析
在某些情况下我们希望函数参数的个数可以根据实际需要来确定,所以C语言中就提供了一种长度不确定的参数,形如:“…”,通过将函数实现为可变参数的形式,可以使得函数可以接受1个以上的任意多个参数。典型的例子有printf()、scanf()函数等,下面就用printf函数的原型为例分析:int printf( const char *format [, argument]... );如上...
2018-04-19 16:53:18
137
原创 栈帧——函数的调用过程
> 什么是栈帧> 栈帧详解一、什么是栈帧 定义: 栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。 每一次函数调用都是一个过程,这个过程要为函数开辟空间、分配地址,用于本次函数的调用中临时变量的保存和传递。这块空间我们就称为函数栈帧。二、栈帧详解以一个简单代码为例: 转到反汇编:1.main函数的栈帧分配...
2018-04-15 16:46:51
369
原创 C语言实现简易扫雷游戏
扫雷是大多数人初期接触电脑时玩过的游戏之一,一个简易的扫雷游戏用C语言实现也很简单,下来先介绍一下扫雷游戏主要需要实现的功能:1.第一次排雷,不炸死。 2.坐标周围没雷,可以实现展开。 3.第一次排雷之后遇到雷,炸死。 4.排完所有雷游戏胜利。 5.雷阵定义为一个ROW*COL的数组内含X个雷。先定义头文件:#ifndef __lei_h__#define __lei...
2018-04-10 21:05:57
408
原创 C语言实现三子棋小游戏
三子棋,和五子棋的原理是一样的,当玩家或者是电脑的某一方先将各自的三个棋子下成一条线时谁就赢,游戏就会结束。游戏会有三种结果:电脑赢、玩家赢、平局。在代码中也需要这三种情况的判定。要写程序,就要清楚代码需要几个模块,可以分为以下几个:棋盘初始化电脑、玩家分别走棋输赢的判定先对头文件定义:头文件名 sanziqi.h #ifndef __sanziqi_h_...
2018-04-08 22:36:25
223
原创 C语言数组的介绍
所谓数组,就是用于储存多个相同类型数据的集合。这篇文章会从数组的创建和初始化、数组的使用、数组的指针访问等方面介绍一维数组和二维数组。一维数组 一维数组是最简单的数组,其逻辑结构是线性表。要使用一维数组,需经过定义、初始化和应用等过程。一、一维数组的创建和初始化 创建方式: type_t arr_name [const_n]; //...
2018-04-04 20:35:38
411
1
原创 C语言操作符介绍
C语言操作符是说明特定操作的符号 ,它是构造C语言表达式的工具 。C语言的运算异常丰富,除了控制语句和输入输出以外的几乎所有的基本操作都为操作符处理。C语言内操作符可分为算术运算符、关系运算符、逻辑运算符和一些用于完成特殊任务的运算符。 可细分为以下几类: 一、 算术操作符: + - * / %(取模) 1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。...
2018-03-30 20:59:31
324
1
原创 用C语言对一元二次方程求解
一元二次方程标准形式为 ax²+bx+c=0,且a≠0。在用C语言求值时,需要先判断给出的a、b、c三值是否满足一元二次方程,即判断a是否为0。当a=0时,输出(不是一元二次方程);当a≠0时,再利用b²-4ac判断值的个数:b²-4ac=0,方程有一个解;b²-4ac<0,方程无解;b²-4a>0,方程有两个不同的解。一元二次方程求解公式为:x=[-b±√(b²-4a...
2018-03-25 16:03:38
19304
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅