随笔分类 -  C/C++编程

摘要:1. const 在C和C++中的区别 C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所以在C++中const修饰的量可以用在数组的定义中。 而在C中,const是一个不能被改变的普通变量,既然是变量,就要占用存储空间,所以编译器不知道编译时的值.而且,数组定义时的下标必须为常量. 在C语言中: const int size; 这个语句是正确的,因为它被C编译器看作一个声明,指明在别的地方分配存储空间.但在C++中这样写是不正确的.C++中const默认是内... 阅读全文
posted @ 2012-02-27 21:56 Mr.Rico 阅读(12317) 评论(0) 推荐(1) 编辑
摘要:2011年4月9日10:09:19c语言中的浮点数在内存中的表示(VC++编译器中):char:1个字节short:2个字节int:4字节long:4字节float:4字节(单精度)double:8字节(双精度) 参考:http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html 无论是单精度还是双精度在存储中都分为三个部分: 符号位(Sign) : 0代表正,1代表为负 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储 尾数部分(Mantissa):尾数部分 其中float的存储... 阅读全文
posted @ 2012-02-27 20:39 Mr.Rico 阅读(19069) 评论(8) 推荐(2) 编辑
摘要:2011年4月9日17:42:57C中的字符串数组与字符串指针的区别 从上面的截图,我们可以看到字符数组和字符串的差别。他们的类型是不同的,比如上面的代码中,filename的类型是char[12],而pname的类型是char*,&filename的结果是数组指针,图中显示的是char[12]*。还可以发现,对于pname和p虽然是两个不同的指针,但是他们都指向同一个地址,这也是编译器投机取巧的地方,因为他们都是指向"fangzhen"这个字符串,所以编译器就只存储一次。还有&"fangzhen"的用法也是可以的。2011年4月10日1 阅读全文
posted @ 2012-02-27 20:06 Mr.Rico 阅读(3679) 评论(2) 推荐(0) 编辑
摘要:可以使用fwrite()将一个结构体写入文件: fwrite(&some_struct,sizeof somestruct,1,fp);对应的fread函数可以再把它读出来,此处fwrite受到一个结构的指针并把这个结构的内存映像作为字节流写入文件。sizeof操作符计算出结构占用的字节数。但是这样用内存映像写出的数据文件却是不能够移植的,尤其是当结构中包含浮点成员或指针的时候。结构的内存布局跟机器和编译器都有关。不同的编译器可能使用不同数量的填充位,不同机器上基本类型的大小和字节顺序也不尽相同。因此,作为内存映像写出的结构在别的机器上(甚至是被别的编译器编译之后)不一定能被读回来。 阅读全文
posted @ 2012-02-17 16:42 Mr.Rico 阅读(18740) 评论(0) 推荐(1) 编辑
摘要:/Files/xkfz/为什么采用虚函数virtual.ppt C++中的继承与虚函数各种概念 虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段。而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个间接的指针去存取基类对象中的字段。 继承的特性 继承是面向对象中引入的重要特性之一,它的一个重要的特点就是子类是父类,父类不是子类。也就是说: 1. 如果基类指针指向子类对象(pbase=&pchild),则该指针只能调用基类定义了的函数;(因为这个地方是静态绑定,而静态绑定所依赖的就是指... 阅读全文
posted @ 2012-02-16 16:01 Mr.Rico 阅读(5025) 评论(0) 推荐(1) 编辑
摘要:在C和C++中是不同的,我们知道C语言比较宽松、灵活,而C++的目标就是改变C语言比较宽松的特点,实行了比较严格的做法,包括严格的类型检查等等。实际上,在C语言中,main函数可被递归调用,而在C++标准中,main函数不可以被递归调用。C中递归调用: (参考:http://blog.csdn.net/songkexin/article/details/1842654#reply)#include<stdio.h>intmain(){intc;if((c=getchar())!=EOF)//EOF用Ctrl+Z(win)//Ctrl+D(linux){main();}printf( 阅读全文
posted @ 2012-02-16 10:55 Mr.Rico 阅读(5541) 评论(1) 推荐(1) 编辑
摘要:参考:http://blog.csdn.net/wanwenweifly4/article/details/6739687 红色是我添加的,其他地方是原作者的。 主要是看了上面的这篇“从底层汇编理解 c++ 引用实现机制“的文章之后,觉得不错。就转了过来,同时,对文中的程序都在自己的机器上验证了一下。 使用的G++版本:g++ (GCC) 4.5.1 20100924 如果要查看汇编后代码与源码的关系,我用的方法是: 先用g++生成带有调试信息的目标文件:g++ -g -c ref.cc 然后再利用objdump命令查看目标文件ref.o:objdump -S ref... 阅读全文
posted @ 2012-02-05 09:25 Mr.Rico 阅读(2371) 评论(1) 推荐(3) 编辑
摘要:开始学习在Linux下写程序,利用gcc进行编译的时候经常需要添加一些选项,为了便于查找,将这写常用的选项整理出来。GCC常用选项 -c 通知GCC取消链接步骤,即编译源码并在最后生成目标文件; -Dmacro 定义指定的宏,使它能够通过源码中的#ifdef进行检验; -E 不经过编译预处理程序的输出而输送至标准输出; -g3 获得有关调试程序的详细信息,它不能与-o选项联合使用; -Idirectory 在包含文件搜索路径的起点处添加指定目录; -llibrary 提示链接程序在创建最终可执行文件时包含指定的库; -O、-O2、-O3 将优化状态打开,该选项不能与-g选项联合使用; -S 要 阅读全文
posted @ 2012-02-02 22:13 Mr.Rico 阅读(350) 评论(0) 推荐(0) 编辑
摘要:内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法。Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则:任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。Linux下的GCC奉行的是另外一套规则:任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。下面的程序可以验证:#include<stdio.h& 阅读全文
posted @ 2011-12-21 23:37 Mr.Rico 阅读(2102) 评论(2) 推荐(0) 编辑
摘要:最近在跑一些程序,需要计算程序运行的时间,然后搜索了一下相关的材料,发现下面的一个比较好的方法,可以实现毫秒级的计时: #include<sys/timeb.h>#ifdefined(WIN32)#defineTIMEB_timeb#defineftime_ftime#else#defineTIMEBtimeb#endiftime_tltime1,ltime2,tmp_time;structTIMEBtstruct1,tstruct2;ftime(&tstruct1);//starttimemstime(&ltime1);//starttimes//worktime 阅读全文
posted @ 2011-11-14 14:47 Mr.Rico 阅读(22164) 评论(0) 推荐(1) 编辑
摘要:昨天在linux下运行一个C程序,是处理一段视频中的每一帧的,本来在程序中是要每处理完一帧就要输出一条信息的,但是在运行是却不显示,而是在程序运行完成之后一块输出的,但是在windows中运行程序就没有这个问题。如果是这样的话,就非常不爽了,因为本来是想通过程序的输出来得到程序当前的运行状况,现在却达不到这种效果。然后上网上搜索了一下,看来果然有解决方案。存在这个问题的主要原因就是在调用printf输出信息后,程序并不是立即输出,而是将其输出到了缓存中,所以,我们要做的就是在printf之后立即将缓存中的信息输出到终端。所以可以在printf之后添加fflush(stdout),这样就能立即将 阅读全文
posted @ 2011-10-24 10:45 Mr.Rico 阅读(4189) 评论(0) 推荐(0) 编辑