08 2013 档案
摘要:1. 函数调用约定 关于 C/C++ 函数调用约定,大多数时候并不会影响程序逻辑,但遇到跨语言编程时,了解一下还是有好处的。 VC 中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调用方式,在 DLL 导出函数中,为了跟Windows API 保持一致,建议使用 __stdcall 方式。 调用约定跟堆栈清除密切相关。如果写一个汇编函数,给 C/C++ ...
阅读全文
摘要:在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Globa...
阅读全文
摘要:非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS...
阅读全文
摘要:指针数组,故名思义,就是指针的数组,数组的元素是指针; 数组指针,同样,就是直想数组的指针。 简单举例说明: int *p[2]; 首先声明了一个数组,数组的元素是int型的指针。 int (*p)[2]; 声明了一个指针, 指向了一个有两个int元素的数组。 其实这两种写法主要是因为...
阅读全文
摘要:本文主要介绍va_start和va_end的使用及原理。 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); ...
阅读全文
摘要:以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码的思路是相对很清晰的。以后的KMP算法求解建议依照此版本进行代码构思。再次强调下本版本的next数组:例如:// T = a b c a b c a b c d//下标: 0 1 2 3 4 5 6 7 8 9//next: -1 0 0 0 1 2 3 4 5 6该版本的next数组的一个好处在于:字符串的下标是从零开始的,符合C++下string本身的特点;且另next[0]=-1,...
阅读全文
摘要:前言:纠结于KMP已经两天了,相较于本人之前博客中提到的几篇博文,本人感觉这篇文章更清楚地说明了KMP算法的来龙去脉。http://www.cnblogs.com/goagent/archive/2013/05/16/3068442.html1、传统的字符串匹配算法/* * 从s中第sIndex位置开始匹配p * 若匹配成功,返回s中模式串p的起始index * 若匹配失败,返回-1 */int index(const std::string &s, const std::string &p, const int sIndex = 0){ int i = sIndex, j =
阅读全文
摘要:前言:本人最近在看《大话数据结构》字符串模式匹配算法的内容,但是看得很迷糊,这本书中这块的内容感觉基本是严蔚敏《数据结构》的一个翻版,此书中给出的代码实现确实非常精炼,但是个人感觉不是很好理解。截止到目前为止,讲解KMP算法的文章,个人比较推荐有两篇:http://www.cnblogs.com/c-cloud/p/3224788.htmlhttp://www.matrix67.com/blog/archives/115这两篇文章的解释基本思路是一致的,前者提到的部分匹配值就是后者提到的P[]数组(均对应于《算法导论》中KMP算法的next数组的求解),但是不同于《大话数据结构》和严蔚敏教材里
阅读全文
摘要:最近看网上帖子时,看到一位网友提到的一个有意思的问题: int main() { float a; a=1.1; } 当我编译这样一段程序,VC会提示:warning C4305: '=' : truncation from 'const double ' to 'float '。 ...
阅读全文
摘要:1. 先上代码: void swap1(int &a, int &b){ a ^=b; b ^=a;//b=(a^b)^b=a a ^=b;//a=(a^b)^a=b } void swap2(int& a, int& b) { a+=b;//a=a+b b-=a;//b=b-(a+b)=-a ...
阅读全文
摘要:1.基本原理 在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题yⅠ和Ⅱ)中,而在中国则可以追溯至东汉出现的《九章算术》。 两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。例如,252和105的最大公约数是21(252 = 21...
阅读全文
摘要:1. 函数使用概况 assert宏能测试传入表达式的真假值,当表达式为真(true),则不会有任何反应;当表达式为假(false),则函数将输出错误信息,并中断程序的执行。 assert宏可以用来判断某表达式的真假值,并在程序执行的过程中实时响应错误信息,因此在程序开发的过程中,常常被用来作程序纠错的工具,当程序开发完成,只需要在加载头文件前面,利用#define指令定义NDEBUG这个关键字...
阅读全文
摘要:void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。 void指针使用规范 ①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如: int * pint; void *pvoi...
阅读全文
摘要:1. 一个经典实例 1 /* 2 用法:const_cast (expression) 3 该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。 4 一、常量指针被转化成非常量指针,并且仍然指向原来的对象; 5 二、常量引用被转换成非常量引用,并且仍然指向原来的对象; 6 三、常量对象被转换成非常量对象。 7 type_id 必须为指针或引用 8 */ 9 class B10 {11 public:12 int m_iNum;13 B():m_iNum(5...
阅读全文
摘要:1. free store VS heapfree store (自由存储区)和 heap (堆),在C/C++中经常会遇到。他们是否有区别呢?偶最早发现这两个概念性问题是在《Exceptional C++》一书中。其中提到C++中使用new分配所得的内存是分配在 freestore 上,而C 风格的内存分配 malloc 分配所得的内存是在 heap 上。额。这个有什么区别呢?通过在 Google 的搜索,所得的中文资料相当少,英文的倒是不少,而且不少还有争议性质。不过部分观点是已经达成共识的。这里,作为翻译,略微加上一点自己的思想,写在这里——首先呢,有必要知道malloc内存分配和new
阅读全文
摘要:本文转自:http://blog.csdn.net/wtong/article/details/20678 我真的没有写错,我说的就是扮虎吃猪,不是我们经常见到的扮猪吃虎。不过我还是先讲讲大家都知道的扮猪吃虎。 什么叫作“扮猪吃虎”呢?即是说猎人要捉老虎,在无法力擒的时候,就装扮成一只猪猡,学成猪叫,把老虎引出来,待走近时,然后出其不意,猝然向它袭击。这突击结果,虎纵不死...
阅读全文
摘要:根据《C++ Primier》P39及其习题的解答,综合总结左值右值的概念如下:(1)左值:左值就是变量的地址,或者是一个代表“对象在内存中的位置”的表达式。左值可以出现在赋值语句的左边或者右边;(2)右值:右值就是变量的值,右值只能出现在赋值语句的右边,不能出现在赋值语句的左边,只可在左边。对于一个变量名来说,其出现在赋值语句的左边,就是一个左值;而出现在赋值运算符右边的变量名或者字面常量就是一个右值。例如: val1 = val2/15;这里的val1就是一个左值,而val2和15就是右值。1. C++左值与右值概念变量和文字常量都有存储区,并且有相关的类型,区别在于变量是可寻址的;对于每
阅读全文
摘要:作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/关于默认构造函数的一些内容补充:1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。2.若没有提供任何构造函数,那么c++提供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。3.只要类中提供了任意一个构造函数,那么c++就不自动提供默认构造函数。4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随机的。1.什么是默认构造函数?一个函数是默认构造函数当且
阅读全文
摘要:《C++Primer》第四版 2.3.5节中这么说到:①变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。②变量声明:用于向程序表明变量的类型和名字。③定义也是声明:当定义变量时我们声明了它的类型和名字。④extern关键字:通过使用extern关键字声明变量名而不定义它。1.定义也是声明,分配了存储空间;而extern声明不是定义,即不分配存储空间。extern告诉编译器变量在其他地方定义了。例如:extern int i; //声明,不是定义, int i; //声明,也是定义也可以这么理解:变量的“声明”有两种情况:1、一种是需要建立存储空间的。例如:
阅读全文
摘要:之前看帖子,发现许多时候基本上大家都把求模和求余混为一谈了。但实际上二者的概念是有区别的 1. 求余 在C语言中,求余对应的操作符是%,且a%b求余的最后结果总是与a符号相同,最后的数值为|a|%|b|。 故而 12%256=12; -12%256=-12; -12%-256 = –12; 12%-256 =12; 2. 求...
阅读全文

浙公网安备 33010602011771号