- 博客(26)
- 收藏
- 关注
原创 浅谈智能指针
在说智能指针之前,我们先来看以下代码://文件——Smart_ptr.h#include <iostream>#include <vld.h>using namespace std;class Test{public: Test(int a = 10,int* p = NULL):ma(a),mp(p) {cout<<"Test()"<&l...
2018-06-01 22:27:09
560
原创 C++—继承与多态
一、类继承 C++是一种面向对象的语言,最重要的一个目的就是——提供可重用的代码,而类继承就是C++提供来扩展和修改类的方法。类继承就是从已有的类中派生出新的类,派生类继承了基类的特性,同时可以添加自己的特性。...
2018-05-28 00:37:13
25506
8
原创 两个有序无头节点单链表的合并
现在正是春招的时候,我这个准毕业生也参加了各大公司的招聘活动,前段时间过了一家的线上笔试,有幸去到面试现场和面试官直接交流,结果虽然不尽如人意,可也算是为了今年春招作下准备工作。当时,面试官让我现场写一道编程题,题目是:现有两个已排序单链表,请设计算法将两个链表合并为一个已排序单链表。初看我觉得很简单,虽然数据结构已经有段时间没看了,可这种“基础题”也不至于完全不会啊!面试官让我先整理...
2018-04-26 14:50:42
2947
1
原创 C++前序——(2)目标文件
一、目标文件我们知道,程序在经过预编译、编译以及汇编之后就得到了目标文件。而在window中,可执行程序的格式是PE,在Linux中是ELF。其实目标文件和可执行文件的格式几乎是一样的,广义上将两者看作是同一种类型的文件。在这里,我们主要讨论Linux下ELF格式的目标文件。实际上,在Linux中,不光目标文件和可执行文件是按照ELF文件格式存储的,还有动态链接库和静态链接库中的文件都
2017-12-15 21:13:46
1175
2
原创 C++前序——(1)虚拟地址空间
一、前言以前的程序,都是直接运行在物理内存上的,即程序在运行时访问的地址都是物理地址。这种方式带来的问题就是:如何把有限的物理内存分配给这么多程序使用呢?与此同时,这种内存分配策略也带来几个问题:(1) 程序间的地址不隔离,恶意程序可能会借此损坏正常程序的数据。(2) 内存使用效率低,由于内存大小有限,当剩余的内存不够装载接下来要运行的程序的时候,正在运行的程序需要暂停
2017-12-12 00:23:08
651
原创 内排序——插入排序—直接插入(稳定)—希尔(不稳定)
一、排序排序是计算机程序中的一种重要操作,功能是将一个任意的数据序列,重新排列为一个有序的序列。1.排序的分类:(1) 内排序:待排序记录存放在计算机内存中进行的排序过程,之后的排序方法都属于内排序。(2) 外排序:待排序记录较多,需要利用到外存。2.排序的数据分类:(1) 存放在地址连续的一组存储单元中——顺序存储结构(常采用)(2) 存放在静态链表(3) 存放在
2017-11-30 19:36:07
3411
原创 线程(1)
一、线程的基本概念1.线程:进程内部的一条执行路径(序列),所有的进程至少有一个执行线程——主线程,即唯一的一条执行路径就是从主函数的第一行代码到最后一行。2.进程和线程:(1)进程是一个正在运行的程序,它为其中的一个或多个线程分配资源。线程只是一条执行路径。(2)在进程中创建一个新线程时,新的线程有自己的栈(即有自己的局部变量),与主线程共享全局变量、文件描述符、信号处理函数
2017-11-30 00:28:27
261
原创 管道——(1)有名管道和无名管道
管道是用于“两个进程间的通信”的一种特殊的文件,它又分为有名管道和无名管道。本文介绍了两种不同管道及其使用方法。
2017-11-18 18:27:26
3181
原创 系统调用——open、write、read和close
一、文件描述符 每一个进程都有一个与之相关的文件描述符,它们是一些小值整数,我们可以通过这些文件描述符来访问打开的文件。 一般地,一个程序开始运行时,会自动打开3个文件描述符: 0——–标准输入———-stdin 1——–标准输出———-stdout 2——–标准错误———-二、write系统调用1.write系统调用的原型:#include <unistd.h>size_t write(
2017-11-13 17:20:11
13855
原创 栈:中缀表达式改为后缀表达式
一、后缀表达式的转化 将中序(中缀)表达式 5+4-3+4x5-6x(6-3) 转为后缀表达式 1.加括号 2.运算优先级:先乘除后加减 3.从左往右 4.运算符右置 5.去括号((((5+4)-3)+(4x5))-(6x(6-3))) 54+3-45x+663-x-二、中缀表达式和后缀表达式的区别 我们人使用的是中缀表达式,如:3+4*12,计算机是理解不了这样的式子的,因为我们知
2017-11-12 19:56:24
770
原创 堆排序
一、堆 将一个数组arr = {12,23,25,17,48,49,56,65,73,89},也就是一个无序序列,看作是一个完全二叉树,则对应以下结构:如果该结构是是堆的话,则堆顶元素(二叉树的根)必须为序列中的最大值或最小值,因而堆又分为大根堆和小根堆。1.大根堆:整个堆中,左子结点的数据和右子结点的数据都比父结点的数据小。2.小根堆:整个堆中,左子节点的数据和右子节点的数据都比父结点的大。二、
2017-11-09 18:38:20
698
原创 判断一个单链表中是否有环
最近在学习数据结构中关于链表的部分,顺序表、单链表、循环链表、双向链表、静态链表和不带头结点的各种链表…. 直到遇见了带环的单链表,我才发现这个世界没有最变态的东西,只有更变态的东西….. 话不多说,开始今天的主题吧!顾名思义,有环的单链表就是一个单链表中出现了一个环,但是这个环比较特殊,它的位置很有讲究。我们知道,单链表的结构为:而且在链表中,一个数据节点只能有一个前驱和一个后继,那么单链表要
2017-11-06 16:58:32
1126
原创 分页内存管理——虚拟地址到物理地址的转换
引子:这是逻辑地址(虚拟地址),包括程序中打印的变量地址显示的都是逻辑地址,并不是内存空间上的物理地址。每条指令在被执行时,读取操作数时需要给出操作数所在的内存地址,这个地址不能是物理主存地址,因为该程序在哪种硬件设置的机器上运行并不能事前确定,那操作系统就不能在此给出对应于某台机器的物理地址。一、物理内存和虚拟内存我们先来了解一下,什么是物理内存,什么又是虚拟内存? 1.物理内存:指通过物理内存
2017-10-29 00:15:21
27026
2
原创 启动新进程之复制进程映像——fork系统调用
一、fork() 我们可以利用fork,这个系统调用来复制当前进程,创建新进程,即在进程表中创建新的表项。 调用fork()的进程称为“父进程”,创建出来的新进程叫做“子进程”。 子进程的许多属性和当前的进程是一模一样的,例如新进程和原有进程的可执行程序是同一个程序,上下文和数据,绝大部分就是原进程(父进程)的拷贝,但它们是两个相互独立的进程! 而且新进程有自己的数据空间、环境和文件描述符。
2017-10-27 23:41:23
812
原创 转义字符
C语言中的数据表示总体分为变量和常量,其中常量又包括实型、整型和字符型,字符型常量中又细分为普通字符、字符串常量和转义字符,转义字符是这次的主题。见下图数据表示分布图。转义字符,经常用来表示常见的那些无法显示的控制字符,如 \n——换行、\t——制表符等,由于程序不能用一个一般形式的字符来表示这些特殊字符,就采用这种转义字符来表示。转义字符的内容在C语言基础里就已经有了详细的讲解,我之所以单独拎出
2017-10-25 17:41:17
1093
原创 链表——单链表
一、单链表 单链表,就是线性表的链式存储结构,又称线性链表。 它的特点是:用一组任意的存储单元存储线性表的数据元素,即结点之间在逻辑上是连续的,在物理上是不连续的。 单链表是带有头结点的,头节点只起到“哨兵”的作用,它的数据域是不使用的,指针域指向第一个数据域的位置。以下代码是单链表各个结点的逻辑表示:data是节点的数据域,next是指针域——存储下一个结点的地址。t
2017-10-22 10:55:44
1118
原创 Linux系统之下的基本gdb调试
一、调试的工具: gdb二、调试的对象: 可执行程序,而不是.c文件,调试的对象一定是一个进程。调试时,程序必须带有调试信息,所以在编译链接的过程中,需要加上参数“-g”。三、调试的命令:l 显示代码 回车 继续执行上一操作 b + 行号 加断点 info + b(break) 查看断点信息 r 运行程序 n 下一步,单步执行 p +
2017-10-21 20:03:48
6751
原创 回文——数组、数字、字符串
回文,即把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣….简单来说,就是正着读反着读是一样的。 那么,在C语言一共有三种形式的回文——数字、数组、字符串。下面就对这三种回文的判断方法进行解说。一、数组——{1,2,3,4,3,2,1} 怎样判断一个数组是不是回文?指针的解引用在回文判断上起到了非常重要的作用,也就是两个指针分别指向数组的头和尾,同时向中间移动、靠拢,再通过解引
2017-10-20 12:54:17
1070
原创 申请动态内存——malloc()函数及其扩展函数
1.malloc()概述——申请动态内存malloc(num)向系统申请num字节的动态内存,内存于“堆”里存放,若申请成功,则函数返回(无类型)数组的首地址,失败则返回NULL,并且申请之后的内存中并没有初始化。该函数需要引用头文件——stdlib.h。 由于“堆”有一个特性——由程序自行管理内存,所以在申请了动态内存之后,需要利用free()自行释放,这是为了避免出现野指针,并且把指向
2017-10-11 23:46:10
19978
3
原创 C和指针考试——整理
1.函数定义中,有语法错误的是:void fun(int x, int*y) { *x *= *y;}在函数的形参列表当中,声明了一个整型指针y和一个整型变量x,在函数体中,出现了对整型变量x使用*(解引用)的操作,非法。2.给出以下定义,下列哪些操作是合法的?const char *p1 = “hello”;char const p2 = “world”;A:p1++; B:p1
2017-10-08 23:13:17
493
原创 计算int型数据的二进制形式中——1的个数
解法一:利用整型数据除法的特点,通过相除和判断余数的值来分析1的个数. 例如:1011 0110 第一次除以2,商为 1011 011,余为 0. 第二次除以2,商为 1011 01 ,余为 1. 对于二进制操作,对数字除以2,原来的数字就会减少一个0,如果有余数,则表明当前位置有一个1. 代码如下:int count1_1(int num){ int count = 0;
2017-10-08 21:44:20
2979
原创 浅聊内存重叠
内存重叠:拷贝的目标地址在源地址范围内,即拷贝的目标地址和源地址有重叠。就一个例子来进行展开:现有一整型数组arr[10] = {1,2,3,4,5,6,7,8,9,10},要求将其拷贝到整形数组brr[10]当中去,这是很简单的,类似于字符串的拷贝,但是同时又与之有区别。如果现在我们选择将从arr[4]开始将6个元素拷贝到从arr[0]开始的位置,这样将会出现怎样的结
2017-08-29 13:12:55
436
原创 C语言基础考试整理
以下内容是我对于在第一次考试的试题中出现的知识点做的一些归纳和总结。 常量不能被修改:变量和常量。变量是先定义后使用还可以修改的量,常量是不可修改的量。例如:int a = 10;在这里a是变量,10是常量,a可以作为左值被修改,10不可以被修改。如下题:char *p = “hello”;*( p+1) = ‘w’;以上程序最终是会崩溃
2017-08-24 16:22:56
1079
原创 函数、全局变量、局部变量和动态内存的特点归纳
生命周期 作用域 默认值 内存区域 链接属性 全局变量(定义在函数外部的变量) 普通全局变量 程序运行开始创建,程序退出才销毁 从定义变量处到本文件结尾都能使用...
2017-08-16 22:50:44
2476
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人