自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

青春兵荒马乱的专栏

hold on and keep fighting !

  • 博客(58)
  • 资源 (1)
  • 收藏
  • 关注

转载 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则

一 :关于指针和堆的内存分配先来介绍一下指针: 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量。既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上,都是4个字节大小,里边只是存储了一个变量的地址而已。不管什么类型的指针,char * ,int * ,int (*) ,string * ,float * ,都是说明了本指针所指向的地址空间是什么

2014-05-10 10:45:23 413

转载 TCP协议中的三次握手和四次挥手(图解)

建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:先来看看如何建立连接的。首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。那如何断开连接呢?简单的过程如下:

2014-04-08 22:56:08 501

转载 C++中智能指针的设计和使用

转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235     智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对

2014-03-22 10:11:06 336

转载 Linux网络编程入门

(一)Linux网络编程--网络知识介绍Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从另外一        个地方获取文件的时候,是我

2014-03-21 18:32:16 363

原创 已知中序后序创建二叉树

#include#include#include#includetemplateclass BinaryTree{public: struct TreeNode { Type data; TreeNode *leftchild, *rightchild; }; BinaryTree() {} ~BinaryTree(){}private: TreeNode *

2014-03-19 20:20:48 774

转载 C/C++位运算技巧

预备知识对于位运算,大家都很熟悉,基本的位操作有与、或、非、异或等等。在面试中经常会出现位运算相关的题,所以我就做了简单的整理,参考了很多写的很好的博客及书籍。现在简单说一下,移位运算。左移运算:x 右移运算:x >> y。将x右移y位,这需要区分x是有符号数还是无符号数。在x是无符号数时,只需将x的最右边的y位丢弃,在左边补上y个0。在x是有符号数时,又分为x是正

2014-03-19 20:18:48 429

转载 C++ 对象的内存布局(下)

C++ 对象的内存布局(下) 陈皓http://blog.csdn.net/haoel  重复继承 下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。 下图是一个继承图,我们重载了父类的f()函数。  其类继承的源代码如下所示。其中,每个类都有两个变量,一个是整形(4字节),一个是字符(1字节),而且还

2014-03-06 21:28:56 356

转载 C++ 对象的内存布局(上)

陈皓http://blog.csdn.net/haoel  前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是为了图一些表达

2014-03-06 21:15:36 389

转载 C++ 虚函数表解析

陈皓http://blog.csdn.net/haoel  前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是

2014-03-06 21:09:43 399

转载 关于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT、L

char :单字节变量类型,最多表示256个字符,wchar_t :宽字节变量类型,用于表示Unicode字符,它实际定义在里:typedef unsigned short wchar_t。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,定义宽字节类型方法如下:    wchar_t c = `A' ; wchar_t * p = L"Hello

2014-03-02 21:59:23 334

转载 一个fork的面试题

前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下。这个题是这样的:题目:请问下面的程序一共输出多少个“-”?1234567891011121314

2013-12-16 22:53:28 359

转载 C++类对象内存模型与成员函数调用分析(下)

2.4.2 多重继承下的虚拟函数多重继承下的虚拟函数主要有一下几个麻烦:1.         几个父类都声明了相同原型的virtual函数;2.         有不止一个父类将其析构函数声明为虚拟;3.         一般的虚拟函数问题;先给出代码段9。class Parent1{public:   Parent1() : data_parent1(0.0)

2013-12-13 18:01:31 342

转载 C++类对象内存模型与成员函数调用分析(中)

2.4 虚拟成员函数这是本文中最复杂也最有趣的话题了。虚拟函数也是和继承这个话题相伴相生,所以本节将纳入对单继承、多重继承和虚拟继承,一起描述他们之间的关系,这样,对C++对虚拟函数的调用,以及由此所变现出来的多态的理解,应该是非常清晰了。2.4.1 单继承下的虚拟成员函数对于虚拟函数,我们首先引入两个数据结构,为什么引入一会就知道了。1

2013-12-13 18:01:03 398

转载 C++类对象内存模型与成员函数调用分析(上)

C++类对象内存模型是一个比较抓狂的问题,主要是C++特性太多了,所以必须建立一个清晰的分析层次。一般而言,讲到C++对象,都比较容易反应到以下这个图表:  这篇文章,就以这个表格作为分析和行文的策略的纵向指导;横向上,兼以考虑无继承、单继承、多重继承及虚拟继承四方面情况,这样一来,思维层次应该算是比较清晰了。1、C++类数据成员的内存模型1.1 无继承情况实验最能说明

2013-12-13 18:00:28 523

转载 C/C++堆栈指引

言    我们经常会讨论这样的问题:什么时候数据存储在堆栈(Stack)中,什么时候数据存储在堆(Heap)中。我们知道,局部变量是存储在堆栈中的;debug时,查看堆栈可以知道函数的调用顺序;函数调用时传递参数,事实上是把参数压入堆栈,听起来,堆栈象一个大杂烩。那么,堆栈(Stack)到底是如何工作的呢? 本文将详解C/C++堆栈的工作机制。阅读时请注意以下几点:    1)本文

2013-12-13 17:58:15 371

转载 C++对象的内存分析(6)

前言    本节讨论构造函数,析构函数和虚析构函数。可能很多人都有这样的经历,面试时经常被问到:什么情况下要使用虚析构函数,为什么要使用虚析构函数?本文将试图对编译器的实现机制进行分析,来回答这个问题。 构造函数和析构函数的调用链    我们从例子来分析,首先我们来看下面这个继承链:    代码如下:class CBasi

2013-12-13 17:57:02 439

转载 C++对象的内存分析(5)

前言    前面4节我们已经完成了对4种C++对象布局的分析,本文试图覆盖更多的,常见的C++面向对象的概念。所以,最后2节将继续阐述2个主题:接口和抽象类以及构造函数、虚构函数和虚析构函数。 接口    这里我准备只主要阐述接口,而不谈一般的抽象类。因为在C++中,是没有“接口”这种类型的,所有的接口事实上是定义为纯抽象类。所谓纯抽象类,就是没有成员变量,没有实现了的函数

2013-12-13 17:56:16 326

转载 C++对象的内存分析(4)

前言    本章节是4个课题的最后一个,我们将讨论多重继承情况下,对象内存的布局。阅读本文,请思考下面的问题:当子类从多个基类继承,虚函数指针和成员变量将如何布局?编译器如何进行子类和基类之间类型转换?如果多个基类具有同样的虚函数,子类选择哪个实现来调用?如果子类重写该虚函数,那么它覆盖的是哪个基类的实现呢? 多重继承    我们将分析这样的例子:CFinal类继承自CBa

2013-12-13 17:55:35 363

转载 C++对象的内存分析(3)

前言    在第二节我们讲到从带虚函数的基类继承的子类,有一个虚函数指针在对象的最前端。但是,如果基类没有虚函数而子类有呢?阅读本节请思考下面的问题:没有虚函数的基类,会有虚函数指针和虚函数表吗?从该类继承的子类,内存中的元素如何布局。 Subject3:从不带虚函数的基类继承的子类    我们把上一节的CBasic类的2个虚函数删除,CFinal从CBasic类继承并增加新的虚函

2013-12-13 17:54:50 360

转载 C++对象的内存分析(2)

前言    本章节讨论单继承情况下类对象的内存特性。阅读时请思考这几个问题:从子类到基类的类型转换,编译器做了什么?多态是怎么实现的?类的成员函数(包括虚函数)和普通函数有什么区别吗?Subject2:从带虚函数的基类继承的子类    类CFinal是我们要分析的目标,它从CBasic中继承而来,重写(override)了虚函数add;增加了一个新的虚函数;增加了一个成员变

2013-12-13 17:53:57 485

转载 C++对象的内存分析(1)

介绍    虚函数表、虚指针、多态、重写(override)、虚析构、指针调整… 这些概念大家应该都不陌生,不过,除了了解概念和用法,你了解他们背后的实现的机制吗。 本文通过的C++类的对象内存进行分析,来讲解这些面向对象的特性是怎么实现的。本文的目的是为了更好的理解C++面向对象的特性的实质,而对于编译器实现的细节并不会过多的涉及。本文所指的C++,在没有特别说明时,特指VC++。

2013-12-13 17:51:56 344

转载 堆和栈的区别(转过无数次的文章)

一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

2013-12-13 17:46:52 303

转载 int main(int argc, char* argv[])用法详解

main函数的参数 我们经常用的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整型变量,argv( 第二

2013-12-13 17:43:28 452

原创 递归实现斐波拉契数列

#includeint f(int n){ if(n <= 1) return 1; return f(n - 1) + f(n - 2);}int main(){ int n; cout <<"请输入数"<<endl; cin >> n; cout << f(n); return 0;}

2013-12-10 21:03:57 437

转载 引用参数与引用返回值

经常看到这样的声明:T& func(T& t),这种声明和T func(T t)有什么区别?书上的解释是为了提高效率,究竟是如何提高效率的呢?内部执行了什么操作?本文通过8个小例子对引用参数和引用返回进行了一次彻底的排查。    首先看一下在类的成员函数中的引用参数和引用返回值:类定义class A{     public:      int x;      A()

2013-12-07 11:25:56 345

转载 复制构造函数(拷贝构造函数)

也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生。对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什么用,其实复制构造函数能解决一些我们常常会忽略的问题。       为了说明复制构造函数作用,我先说说我们在编程时会遇到的一些问题。对于C++中的函数,我们应该很熟悉了,因为平常经常使用;对于

2013-12-06 19:58:13 331

转载 const用法详解

面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也是很耀眼的就const直接可以取代c中的#define以下几点很重要,学不好后果也也很严重const1. 限定符声明变量只能被读   const int i=5;   int j=0;   ...   i=j;   //非法,导致编译错误   j=i;   //合法2. 必须初始化

2013-12-01 14:32:05 394

转载 c++引用详解

一谈引用引用(reference)是c++对c语言的重要扩充。  一、引用的概念  引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。  例如: Point pt1(10,10);  Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。  需要特别强调的是引用并不产生对象的

2013-11-30 16:23:09 535

转载 c++内置类型

C++定义了一组表示整数、浮点数、单个字符和布尔值的算术类型(arithmetic types),另外还定义了一种称为void的特殊类型。void类型没有对应的值,仅用在有限的情况下。通常用作无返回值的函数的返回类型。算术类型的存储空间依机器而定。类型存储空间是指用来表示该类型的位(bit)数。C++标准保证了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。事实上,对于int

2013-11-30 15:24:53 344

转载 C程序编译执行过程

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://lavasoft.blog.51cto.com/62575/187229C程序编译执行过程 认识C编译执行过程,是C学习的开端。简单说C语言从编码编译到执行要经历一下过程: C源代码编译---->形成目标代码,目标代码是在目标机器上运行的代码。连

2013-11-29 12:45:14 407

转载 brk和sbrk及内存分配函数相关

brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的:       每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这 一块分配的。如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理 下将

2013-11-27 22:40:18 286

转载 平衡二叉树排序树

平衡二叉树排序树#include #include #define ENDKEY 0typedef int KeyType;typedef struct node{ KeyType key ; /*关键字的值*/ int bf; //平衡因子 struct node *lchild,*rchild;/*左右指针*/}AVLTNode, *AVLTree;

2013-11-20 12:30:30 724

转载 extern、static、auto、register 定义变量的不同用法

首先得说明什么叫“编译单元”。每个 .c 文件会被编译为一个 .o 文件,这个就是一个编译单元。最后所有的编译单元被链接起来,就是一个库或一个程序。 一个变量/函数,只要是在全局声明的,链接之后都隐含地在所有编译单元中可见。但你的声明可能仅出现在一个 .c 文件中,这就暗示你不想把这个名字暴露给其它编译单元,这种情况下就得用 static 关键字,表示这个名字具有“内部链接”,只对当前编译

2013-11-17 23:59:11 950

原创 二叉排序树的创建查找与删除

二叉排序树的创建查找与删除#include#includetypedef struct Node{ int data; struct Node *lch; struct Node *rch;}BiNode, *BiTree;void Creat(BiTree *T); //创建一个二叉排序树void Insert(BiTree *T, in

2013-11-14 17:12:11 386

原创 二叉树的创建与递归遍历

二叉树的创建于递归遍历#include#includetypedef struct Node{ char data; struct Node *lch; struct Node *rch;}BiNode, *BiTree;void Creat1(BiTree *T); //二叉树的创建,第一种方法BiTree Creat2()

2013-11-11 16:31:27 502

原创 栈的创建入栈出栈

栈的创建入栈出栈#include#includetypedef struct node //结点结构{ int data; struct node *next;}Node, *Pnode;typedef struct stack //栈结构{ Pnode top; Pnode bottom;}Stack,

2013-11-09 14:53:53 633

原创 单链表的逆置

单链表的逆置#include#includetypedef struct node{ char data; struct node *next;}node, *list;list TailCreat(); //尾插法创建链表void Reverse(head); //逆置void print(he

2013-11-07 16:14:20 517

原创 双向链表的建立插入与删除

双向链表的建立插入与删除#include#includetypedef struct node{ char data; struct node *pre; struct node *next;}node, *list;list TailCreat(); //尾插法创建链表void Insert(list head,

2013-11-07 14:18:11 418

原创 单链表的创建插入与删除

单链表的创建插入与删除/*注意因为建表时用了字符型数据所以输入数字时只能输0~9*/#include#includetypedef struct node //结点的结构体{ int data; //数据域 struct node *next;

2013-11-07 09:18:56 891

原创 希尔排序

希尔排序,时间复杂度小于0(nˆ2)#includevoid sort(int *a, int end); /*希尔排序*/int main(void){ int i, a[] = {2,3,7,12,34,2,33,43,5,23,44,256,64,42,1}; sort(a, sizeof(a)/sizeof(int)); for(i = 0; i <

2013-11-02 18:15:54 306

Ucos_ii2.52_源码中文译注

Ucos_ii_2.52源码中文译注,详细讲解Ucos操作系统代码

2013-09-27

空空如也

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

TA关注的人

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