C/C++
typhoonzb
这个作者很懒,什么都没留下…
展开
-
关于C99 标准库的问题
今天凯凯让我给他调试一个简单的程序我在VC6中编译的时候 发现报错:缺少stdbool.h这个头文件。于是上baidu查找了相关资料,发现这是一个C99标准库中定义bool类型的头文件,而起VC不支持C99这个标准库。后来找到了stdbool.h这个代码,自然想到了自己建头文件的方法,但是添加进去之后,编译依然没法通过。分析了下问题后发现集中在#if __STDC_VE原创 2008-09-24 21:41:00 · 1124 阅读 · 1 评论 -
uclinux 多任务(各家之言)
uClinux是专为无存储器管理单元(MMU)的微控制器打造的嵌入式Linux操作系统。uClinux首先被移植到摩托罗拉的MC68328 DragonBall集成微处理器上。从那以后, uClinux越来越受到业界的青睐, 被移植到更多的无MMU芯片上。目前,uClinux已成功移植到ARM7TDMI微处理器上。 由于uClinux主要是针对无MMU 微处理器开发的,大多数内核的二进制转载 2009-10-08 20:30:00 · 1138 阅读 · 0 评论 -
虚继承之单继承的内存布局
C++2.0以后全面支持虚函数与虚继承,这两个特性的引入为C++增强了不少功能,也引入了不少烦恼。虚函数与虚继承有哪些特性,今天就不记录了,如果能搞了解一下编译器是如何实现虚函数和虚继承,它们在类的内存空间中又是如何布局的,却可以对C++的了解深入不少。这段时间花了一些时间了解这些玩意,搞得偶都,不过总算有些收获,嘿嘿。先看一段代码class A{ virtual aa(){};};转载 2009-10-02 16:04:00 · 851 阅读 · 4 评论 -
公有继承,私有继承,和保护继承
1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。 2. 私有继承(private) 私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。 3. 保护继承(protected) 保护继承的特转载 2009-09-27 10:00:00 · 533 阅读 · 0 评论 -
C/C++ 易错
char c[] = "hello world" 分配局部数组char* c = "hello world" 分配全局数组 全局区域的值是不能进行修改的 1 常量指针!如 int b, c; int * const a = &b; 表示a是一个常量指针它指向变量b的内存。但是因为是常量指针所以不能再用a指向其他变量,如 a = &c; 错误!可以修改指向内存的值,如:*a =转载 2009-09-27 09:18:00 · 969 阅读 · 0 评论 -
算法复杂度——时间复杂度和空间复杂度
1、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 (2)时间复杂度 在转载 2009-09-23 19:36:00 · 12564 阅读 · 1 评论 -
算法复杂度
首先接触" 算法复杂度"这个术语是在数据结构这门课程中。数据结构主要是讲如何在计算机中存储.组织数据,对于相同的存储.组织数据方式,往往又有不同的实现方式(即算法)。对于精心实现的算法,往往可以带来更高的运行和存储上的效率,而评价一个实现方式(算法)是否高效就是通过" 算法复杂度"来评定的。目前算法的评定主要是从时间和空间上来评定,毕竟我们对计算机关心的一个是运行时间,另一个就是消耗的存储空间。从转载 2009-09-23 19:35:00 · 982 阅读 · 0 评论 -
C语言左移和右移计算的注意点
左移运算大多数情况下可以看成是乘法运算(除去高位溢出的情况),但是显然比乘法运算快很多。注意点:如果一个字节长的数64 (01000000)则左移两位后值变为0 右移运算:移到右端的低位被舍弃,对无符号数,高位补0. 对于有符号数,正数还是补零,但是负数的话,符号位原来是1,则左移移入0还是1,取决于计算机系统 移入0的称原创 2009-09-21 14:44:00 · 2279 阅读 · 0 评论 -
uClinux和Linux的异同分析
标准Linux是针对有MMU的处理器设计的。在这种处理器上,虚拟地址被送到MMU,把虚拟地址映射为物理地址。通过赋予每个任务不同的虚拟-物理地址转换映射,支持不同任务之间的保护。uClinux是针对控制领域的嵌入式linux操作系统,它从Linux 2.0/2.4内核派生而来,沿袭了主流Linux的绝大部分特性。适合不具备内存治理单元(MMU)的微处理器/微控制器。没有MMU支持是uClinux与转载 2009-10-08 20:52:00 · 634 阅读 · 0 评论 -
计算机删除文件的原理
朋友们从开始学习电脑时起就知道了如何删除文件,而且一些细心的朋友刚学电脑时就留意“Del”和“Shift+Del”删除文件的不同,前者只是将文件删除到回收站中,而后者则可实现所谓的“彻底删除”。这个“彻底删除”到底彻底不彻底呢?看看下面笔者的分析后,你就会知道答案了:一. 常见的“彻底删除”并不彻底要想分析这个问题,我们得从硬盘存储文件的原理说起。大家都知道,一块新硬盘在使用前必须要对其进行分区、转载 2009-10-24 12:13:00 · 9147 阅读 · 3 评论 -
C语言宏定义技巧
语言宏定义技巧(常用宏定义) 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型转载 2010-01-31 17:52:00 · 966 阅读 · 0 评论 -
[转]strcpy()、memcpy()、memmove()、memset()的实现
一直想知道内部实现, 现在想看了, 就找了一下.不错.strcpy()、memcpy()、memmove()、memset()的实现 strcpy(), 字符串拷贝.char *strcpy(char *strDest, const char *strSrc){ assert((strDest!=NULL) && (strSrc !=NULL)); char转载 2010-01-29 21:30:00 · 621 阅读 · 0 评论 -
[转]我对C++内存分配方式的一点看法
作者:骆驼在C++中,内存分成5个区 : 堆、栈、自由存储区、全局/静态存储区和常量存储区。栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。堆,就是那些由new分配的内存块,他们的释放编译器不转载 2010-01-29 21:26:00 · 664 阅读 · 0 评论 -
vc程序中嵌入汇编的语句的说明
为了加速游戏,一提起汇编语言,大家也许会感到很神秘。其实如果你学起来就会发现,它并非想象中那样难。特别是内嵌汇编,由于它和C++紧密结合,使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来比较容易。使用内嵌汇编,特别是使用MMX指令,可以大大提高各种游戏中常见特效的速度,对于编出一个漂亮的游戏非常重要。学好汇编语言还有一个特别有趣的用处:可以观察和看懂VC++生成的汇编代码,从而更好地转载 2009-12-05 17:46:00 · 899 阅读 · 0 评论 -
C语言宏的高级用法
转至 http://hi.baidu.com/hhs_ky/blog/item/bdc4d101e8183b01738da5b6.html关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: #define WARN_IF(EXP) / d原创 2009-11-27 16:50:00 · 3273 阅读 · 0 评论 -
malloc函数字节对齐很经典的问题
int *mallocedMemory = (int *)malloc(1024+15);alignedMemory = (int *)(((int)mallocedMemory + 15) & ~15);((void **)alignedMemory)[-1] = mallocedMemory;return alignedMemory;+15 而不是 +16的原因例: 地址 0原创 2009-10-27 11:03:00 · 10295 阅读 · 4 评论 -
循环嵌套优化!!
第一部分说明:1 将大的循环放到内测,小的循环放到外侧,确实能提高效率/** * 全面测试嵌套多层For循环的性能。 * * @author 老紫竹的家(laozizhu.com) * */public class TestForLoop { public static void main(String[] args) { int small = 1; int midd转载 2009-10-24 11:33:00 · 1727 阅读 · 0 评论 -
二叉树的非递归遍历 C语言版
http://blog.csdn.net/lewutian/archive/2009/09/06/4525382.aspx转载 2009-10-25 22:35:00 · 876 阅读 · 0 评论 -
typedef和#define的区别
#define是在预编译时处理的,它只能作简单的字符串替换,而typedef是在编译时处理的。实际上它并不是做简单的字符替换,例如:typedef int NUM[10];并不是用“NUM[10]”去代替“int”,而是采用如同定义变量的方法那样来声明一个类型。转载 2009-09-21 11:22:00 · 634 阅读 · 0 评论 -
malloc、free与内存碎片
malloc和free大量使用后回造成内存碎片,那么这种碎片形成的机理是什么? 如果机理是申请的内存空间大小(太小)所形成的,那么,申请多大的区域能够最大限度的避免内存碎片呢?(这里的避免不是绝对的避免,只是一种概率) 内存碎片一般是由于空闲的连续空间比要申请的空间小,导致这些小内存块不能被利用。 产生内存碎片的方法很简单,举个例: 假设有一块一共有100转载 2009-09-20 16:04:00 · 4044 阅读 · 0 评论 -
C++基础
类和对象:C++中扩展了结构体,可以包含有函数,缺省情况下还是和C语言一样,成员都是公有的。 不能在类的声明中给数据成员赋初值,只有在类对象定义之后才能赋初值。 数据成员可以使任何数据类型,但是不能用自动(auto)、寄存器(register)、或者外部(extern)进行说明。 隐式定义:直接将函数定义在类的内部显式定义:在定义内置函数时,将它放在类定义体外。为了原创 2009-09-03 13:15:00 · 540 阅读 · 0 评论 -
拷贝构造函数
拷贝构造函数 拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。 在C++中,下面三种对象需要调用拷贝构造函数: 1) 一转载 2009-08-24 10:51:00 · 519 阅读 · 1 评论 -
避免野指针
delete buf; buf = NULL;转载 2009-08-06 15:26:00 · 859 阅读 · 0 评论 -
关键字 mutable (c++)
关键字 mutable 是一个奇怪的修饰符(specifier),它只能够用于一个类的非静态数据成员。下面我将讨论 mutable 的语义和用法,但是首先我要解释一下 C++ 对象模型的一个关键概念。对象的状态 一个对象的状态由其非静态数据成员的值构成,因此,修改一个数据成员将会改变整个对象的状态。将一个成员函数声明为 const 能够保证它不会改变对象的状态。 然而在一些转载 2009-08-05 20:55:00 · 10107 阅读 · 1 评论 -
C相关笔试题或者面试题中的概念以及技巧题1
计算2进制数中1的个数,主要用到m&(m-1) 交换a,b不用中间变量,用异或:a=a^b;b=a^b;a=a^b sizeof不是函数,它是个类似宏定义的特殊关键字,只要是指针,大小就是4. 静态变量时存放在全局数据区的,而sizeof计算栈中分配的大小,是不会计算在内的。sizeof(虚函数)(类)class no_virtual{public: void原创 2009-08-05 20:06:00 · 1127 阅读 · 1 评论 -
using namespace std
using namespace std 所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。一 : 格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全转载 2009-08-05 17:16:00 · 475 阅读 · 0 评论 -
C++ 运算符优先级列表
http://www.cppblog.com/aqazero/archive/2006/06/08/8284.htmlPrecedenceOperatorDescriptionExampleAssociativity1()[]->.::++--Grouping operatorArray accessMember access from a pointerM原创 2009-08-05 17:03:00 · 445 阅读 · 0 评论 -
C++全局变量和局部变量
在讨论全局变量之前我们先要明白几个基本的概念:1. 编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的话,那么你可能非常的理解编译转载 2009-08-05 16:36:00 · 768 阅读 · 0 评论 -
C++基础2
派生类与继承保护成员可以被派生类的成员函数访问,但是对于外界是隐藏起来的,外部函数不能访问它。 创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数;当撤销派生类对象时,则先执行派生类的析构函数,随后再执行基类的析构函数。 当基类含有带参数的构造函数,派生类必须定义构造函数。如果派生类的基类也是一个派生类,则每个派生类只需负责其直接基类的构造,依次上溯。原创 2009-09-03 13:56:00 · 400 阅读 · 0 评论 -
C++基础3
多态性:运算符重载运算符重载通过创建运算符函数operator()来实现。例子:complex operator+(complex a ,complex b){}一般而言,采用成员函数重载双目运算符+后,可以用以下两种方法来使用:aa + bb 或者 aa.operator+(bb) 基类和派生类指针关系1.声明为指向基类对象的指针可以指向它的公有派生的对象,但不允许指原创 2009-09-03 14:28:00 · 403 阅读 · 0 评论 -
malloc()函数比数组有什么优势以及缺点
malloc()函数比数组有什么优势. 悬赏分:0 - 解决时间:2009-8-17 12:54 malloc()函数比数组有什么优势,比如说:我声明一个可以存储100个字符的内存块和声明一个可以存储100个字符的数组,我觉的malloc()并没有比数组占优势.大家可以打个例子来体现malloc()比数组更占优势.谢谢. 问题补充:你们也说,既然我用多少就分配多少,那我转载 2009-09-20 15:54:00 · 4277 阅读 · 1 评论 -
野指针理解和处理
指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。操作不当造成的野指针,甚至会引起系统死机等比较严重的后果。 如果程序定义了一个指针,就必须要立即让它指向一个我们设定的空间或者把它设为NULL,如果没有这么做,那么这个指针里的内容是不可预知的,即不知道 它指向内存中的哪个空间(即野指针),它有可能指向的是一个空白的内存区域,可能指向的是已经受保护的区域,甚至可能指向系统的关键内转载 2009-09-20 15:45:00 · 2492 阅读 · 0 评论 -
C语言共用体union和枚举类型enum
结构体变量所占内存长度是各成员占的内存长度的总和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员长度。 注意点: 1.共用体变量中起作用的成员时最后一次存放的成员,在存入一个新成员后原有的成员就失去作用。 2.不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用变量的指针。 枚举类型:enum weekday{s转载 2009-09-21 10:30:00 · 2327 阅读 · 0 评论 -
volatile关键字说明
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。 用volatile关键字声明的变量i每一次被访问时,执行部件都会从i相应的内存单元中取出i的值。 没有用volatile关键字声明的变量i在被访问的时候可能直接从cpu的寄存器中取值(因为之前i被访问过,也就是说之前就从内存中取出i的值保存到某个寄存器中),之所以直接从寄存器中取值,而不去内存中转载 2009-09-16 19:47:00 · 547 阅读 · 0 评论 -
C笔试加面试题
考查一个初级嵌入式系统开发人员的C基本功,附有答案题目由资深嵌入式系统专家拟定,目的是考查入门级的嵌入式软件开发人员 Gavin Shaw提供详细解答 编者按:非常基本关于C语言的问题,一个信息类(计算机,资讯工程,电子工程, 通信工程)专业的本科毕业生应该达到的水平。题目不难,全部都能快速地答完,当然也需要一定的知识储备。对于大多数人,我们预期你可能答错 3) 4) 15)题,转载 2009-09-14 20:12:00 · 726 阅读 · 0 评论 -
指向多维数组的指针变量
指向多维数组的指针变量把二维数组a分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为: int (*p)[4]它表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。而p+i则指向一维数组a[i]。从前面的分析可得出*(p+i)+j是二维数组i行j 列的元素的地转载 2009-09-14 10:30:00 · 708 阅读 · 0 评论 -
字符串和字符串结束标志
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以/0作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符/0存入数组,并以此作为该字符串是否结束的标志。有了/0标志后,就不必再用字符数组的长度来判断字符串的长度了。C语言允许用字符串的方式对数组作初始化赋值。例如: char c[]={c,转载 2009-09-14 09:35:00 · 1374 阅读 · 0 评论 -
C++基础4
模版 函数模版声明templateT max(T X,T Y){ return (x>y)?x:y;} 注意:实例化T的各模版实参之间必须保持完全一致的类型 模版类定义templateclass stack{void push(Type ch);Type pop();} 类外定义push poptemplatev原创 2009-09-04 09:24:00 · 378 阅读 · 0 评论 -
【转】Perl中的正则表达式
9 Perl 中的正则表达式正则表达式的三种形式 正则表达式中的常用模式 正则表达式的 8 大原则 正则表达式是 Perl 语言的一大特色,也是 Perl 程序中的一点难点,不过如果大家能够很好的掌握他,就可以轻易地用正则表达式来完成字符串处理的任务,当然在 CGI 程序设计中就更能得心应手了。下面我们列出一些正则表达式书写时的一些基本语法规则。-----转载 2010-02-03 00:35:00 · 722 阅读 · 0 评论