
C/C++
文章平均质量分 75
Neo_Wu
这个作者很懒,什么都没留下…
展开
-
关于常量折叠(转)
首先来看一个例子:int main(int argc, char* argv[]){const int i=0;int *j = (int *) &i;*j=1;coutcoutcoutreturn 0;}结果是0012ff7c0012ff7c01因为i和j都指向相同的内存地址,所以输出的前两个结果是相同的,但转载 2012-08-07 11:23:10 · 586 阅读 · 0 评论 -
堆栈溢出
为了了解堆栈溢出,首先让我们研究一下堆栈的工作机制。堆栈的作用就好比短期内存——它存储计算机处理特定函数时所需的信息。当调用一个函数时,程序首先将调用函数所必需的的各种参数放入堆栈中。计算机处理器使用一种能够特殊的处理器寄存器——可扩展寄存器指针(Extented Stack Point,ESP)——来跟踪堆栈的当前位置。这一步骤如图 1-1 所示。图中,函数的参数已经被压入堆栈。请注意,这个转载 2012-08-07 15:36:18 · 1381 阅读 · 0 评论 -
C/C++返回内部静态成员的陷阱
C/C++返回内部静态成员的陷阱陈皓背景在我们用C/C++开发的过程中,总是有一个问题会给我们带来苦恼。这个问题就是函数内和函数外代码需要通过一块内存来交互(比如,函数返回字符串),这个问题困扰和很多开发人员。如果你的内存是在函数内栈上分配的,那么这个内存会随着函数的返回而被弹栈释放,所以,你一定要返回一块函数外部还有效的内存。这是一个让无数人困扰的问题。如果你转载 2012-08-07 15:13:04 · 698 阅读 · 0 评论 -
全局变量和局部变量在内存里的区别
预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)—,全局转载 2012-08-07 15:21:03 · 26025 阅读 · 0 评论 -
写出float x 与“零值”比较的if语句——一道面试题分析
写出float x 与“零值”比较的if语句请写出 float x 与“零值”比较的 if 语句: const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x 不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“EPSINON应该是一个很小的值吧 因为计算机在处理浮点数的时候是有误差的转载 2012-08-07 15:45:32 · 852 阅读 · 0 评论 -
出现频率最高的笔试题strcpy写法
题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。 解说: 1.strcpy的实现代码 char * strcpy(char *转载 2012-08-10 16:37:44 · 739 阅读 · 0 评论 -
拷贝构造函数和赋值构造函数的异同
由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数 有些轻视。请先记住以下的警告,在阅读正文时就会多心: ?? 如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝” 的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐 含了错误。以类String 的两个对象a,b 为例,假设a.m_data 的内容为“hello”, b原创 2012-08-10 22:08:35 · 626 阅读 · 0 评论 -
c语言文件读写方式
文件使用方式 意义 “rt” 只读打开一个文本文件,只允许读数据 “wt” 只写打开或建立一个文本文件,只允许写数据 “at” 追加打开一个文本文件,并在文件末尾写数据 “rb” 只读打开一个二进制文件,只允许读数据 “wb” 只写打开或建立一个二进制文件,只允许写数据 “ab” 追加打开一个二进制文件,并在文件末尾写数据 “rt+” 读转载 2012-08-11 19:04:42 · 4797 阅读 · 2 评论 -
朗讯的笔试题 union struct
朗讯的笔试题是这样的:Typedef union student{ Char name[10]; Long sno; Char sex; Float score [4];} STU;Main (){STU a[5];Printf(“%d/n”,sizeof(a);}答案是80 ,因为union是可变转载 2012-08-20 12:49:04 · 762 阅读 · 0 评论 -
面向对象的三个基本特征(讲解)
面向对象的三个基本特征(讲解)面向对象的三个基本特征是:封装、继承、多态。封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能转载 2012-08-30 18:12:04 · 650 阅读 · 0 评论 -
const用法
优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误(边际效应)const主要是为了程序的健壮型,减少程序出错.最基本的用法:const int a=100; b的内容不变,b只能是100也就是声明一个int类型的常量(#define b =100)int co转载 2012-08-21 17:32:59 · 584 阅读 · 0 评论 -
C语言与OOP思想的结合
从实习到工作至今,一直是使用C语言,而我本身是学习C++出身,看的代码越多,代码量越大,越来越觉得C++对于大型软件架构的良好可控性,和对以后程序员维护代码时良好的可读性;然而就目前来说,在嵌入式领域广泛的使用C++显然是不现实的事情。C语言良好的可移植性,对内存等良好的操作性以及执行之速度均是一般嵌入式产品的不二首选。我们要应此放弃C++吗?当然不,幸好已经有很多优秀的设计师为我们指明了C语言O转载 2012-09-06 11:53:58 · 1386 阅读 · 0 评论 -
Socket的阻塞模式和非阻塞模式
来源:http://blog.youkuaiyun.com/VCSockets/阻塞模式 Windows套接字在阻塞和非阻塞两种模式下执行I/O操作。在阻塞模式下,在I/O操作完成前,执行的操作函数一直等候而不会立即返回,该函数所在的线程会阻塞在这里。相反,在非阻塞模式下,套接字函数会立即返回,而不管I/O是否完成,该函数所在的线程会继续运行。在阻塞模式的套接字上,调用任何一转载 2012-10-14 17:43:06 · 708 阅读 · 0 评论 -
多线程同步机制
线程的同步机制:1、 Event用事件(Event)来同步线程是最具弹性的了。一个事件有两种状态:激发状态和未激发状态。也称有信号状态和无信号状态。事件又分两种类型:手动重置事 件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被 设置为激发状态后,会唤醒“一个”等待中的线程,然后自动恢复为转载 2012-10-18 22:21:43 · 765 阅读 · 0 评论 -
Socket通信实例
1.通信协议:#ifndef _PROTOCOL_H__#define _PROTOCOL_H__namespace OurTutorial{ struct Protocol { int iCmd; //type 0-文件开始 1-文件数据 2-文件结束 char buff[100]; int iUsedSize; //z };}#e原创 2012-10-28 11:26:20 · 1350 阅读 · 0 评论 -
STL vector list map
// pro2.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include #include using namespace std;struct Student{ int iNo; string strName;};原创 2012-10-28 16:25:36 · 543 阅读 · 0 评论 -
lib和dll文件的区别和联系
什么是lib文件,lib和dll的关系如何 (1)lib是编译时需要的,dll是运行时需要的。 如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了。 在开发和调试阶段,当然最好都有。 (2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应转载 2013-01-30 14:14:51 · 497 阅读 · 0 评论 -
Singleton
/******************************************************************** created: 2013/03/04 23:07 Filename: Singleton.h author: Julius****************************************原创 2013-03-04 23:35:14 · 452 阅读 · 0 评论 -
MFC消息机制
上篇总体概述了编程方式的变化,这篇具体就MFC的消息机制进行简单的说明。MFC(Microsoft Foundation Class),微软基础类。在我看来,MFC就是由一个个封装类按照一些特定的规则构成的程序模板。这个模板中最重要的部分应该就是它的消息机制了。为了更好地了解MFC的消息机制,现将MFC消息机制进行简化,保留其最为重要的部分。MFC消息机制有两个重要原创 2013-03-13 18:42:12 · 1119 阅读 · 0 评论 -
C++中的引用变量在内存中存放的位置
这几天一直在思考一些问题,就是引用变量在一些教材上的说法是一个变量的别名,那么引用变量本身是否占用空间呢?比如说:(本人使用的是vc++6.0编译器)int a = 10;int & r = a;cout cout 从上面的例子当中可以看出:它们得出的结果是相同的,这时便会有人说,r和a所占用的内存空间是相同的,因为打印出来的地址是相同的。所以这些教转载 2013-03-30 20:05:33 · 2948 阅读 · 0 评论 -
C++ 虚函数表解析
C++ 虚函数表解析 陈皓http://blog.youkuaiyun.com/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,R转载 2013-03-30 13:32:34 · 587 阅读 · 0 评论 -
C++程序运行时内存布局
声明两点:(1)开发测试环境为VS2010+WindowsXP32位;(2)内存布局指的是虚拟内存地址,不是物理地址。 1.测试代码[cpp] view plaincopy#include using namespace std; int g_int_a; int g_int_b; v转载 2013-03-30 15:40:18 · 1562 阅读 · 0 评论 -
讲述下C++下深拷贝和浅拷贝
某些情况下我们需要将一个对象赋给另一个对象,其中就有一些值得注意的点。浅拷贝: 在没有进行运算符的重载时,一般情况下我们定义一个A a(1,2,3);A b;这两个对象,我们会有 b = a; 这就是对象之间的拷贝,也就是会出现深拷贝和浅拷贝,以及一些错误。首先,b = a是一个浅拷贝过程就是将一些数值进行赋值操作。这就出现一个问题,如果类中含有指针,浅拷贝就会出现问题当a对象析构转载 2013-03-30 17:32:34 · 773 阅读 · 0 评论 -
常量字符串和静态存储区
例:char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc";const char str4[] = "abc";const char *str5 = "abc";const char *str6 = "abc";char *str7 = "abc";char *str8 =原创 2013-03-30 17:52:35 · 945 阅读 · 0 评论 -
C++变量名放哪了
http://hi.baidu.com/jacky_jiajb/blog/item/fb5cfa360cdb1b1d90ef3931.html 原文地址解释1:C++对变量名不作存储,在汇编以后不会出现变量名,变量名作用只是用于方便编译器成汇编代码,是给编译器看的,是方便人阅读的。……int n=5;……编译器编译它时,产生类似mov [0x0转载 2013-03-30 18:08:32 · 1003 阅读 · 0 评论 -
变量名和地址的关系探讨
变量名不占空间变量:用来标识(identify)一块内存区域,这块区域的值一般是可以更改的,这就是它“变”的由来,但是我们可以通过使用如const等一些修饰符号来限定这一内存区域的操作特性(characteristic),即变量的操作特性。用const修饰的使变量不能更改的就和常量一样的变量叫做常变量。变量名:是一个标识符(identifier),用来指代一块内存区域,即变量,使用转载 2013-03-30 19:55:09 · 1292 阅读 · 0 评论 -
COM技术入门基础知识
这几天在学习COM组件技术,网上看了很多教程,发现有一些很基础的东西基本都没有涉及,下面我就结合网上的一些教程加上自己的体会来进行一些总结。 (1)COM组件是什么? COM组件由以Win 32动态连接库(DLL)或可执行文件(EXE)形式发布的可执行代码所组成。再向深入了看,以C++为例,COM组件实际上就是一些实现了特定接口的类,而接口都是纯虚类。组件从接口派生而来。我转载 2013-03-19 23:31:36 · 1009 阅读 · 0 评论 -
Com开发之回调
本例讲述,C#调用com方法后,com在适当时机回调C#方法。具体为,c# 先加载一个回调,然后调用COM的add方法,COM把add操作执行后,sleep 1秒,然后触发回调,返回执行结果。打开项目FirstCom1.打开FistCom.idl,先增加一个回调定义,如下,其中uuid 需要用GUID工具来生成,这段代码必须在IFirstClass定义之前,否则编译可能会报原创 2013-03-19 23:54:50 · 1182 阅读 · 0 评论 -
static_cast、dynamic_cast reinterpret_cast和const_
关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。st转载 2013-03-19 22:41:26 · 667 阅读 · 0 评论 -
二进制文件和文本文件的区别
将文件看作是由一个一个字节(byte) 组成的,那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别; 接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同转载 2013-04-03 09:51:30 · 891 阅读 · 0 评论 -
深入理解递归函数的调用过程
下面是个关于递归调用简单但是很能说明问题的例子:[cpp] view plaincopy/*递归例子*/ #include void up_and_down(int); int main(void) { up_and_down(1); return 0; } void up_and_转载 2013-04-08 08:35:46 · 1018 阅读 · 0 评论 -
COM和套间(Apartments) 1 - 基本知识
OverviewCOM技术过时了吗?这句话也对也不对。从技术上讲,确实COM的使用率在下降,但是从思想上来说,COM的面向接口的思想正在被Java和.NET发扬光大。那我们还需要和COM打交道吗?这取决于你工作的领域。虽然现在微软的平台在慢慢向着.NET迁移,不过,在维护原有非托管代码,编写和Windows系统组件打交道的程序,以及使用CLR调用非托管代码的时候,COM或多或少都是不可避免转载 2013-03-25 16:28:07 · 981 阅读 · 0 评论 -
STL容器里存放对象还是指针
一.问题的引出:容器可以存放对象,可以存放指针,这里要谈的是两者的使用问题。就是什么时候存放对象更好,什么时候存放指针更好? 二.问题的分析过程:1. 首先说下stl容器的工作方式 对于内建类型(int float char等),容器的工作方式是纯粹的位拷贝,这里没有什么需要多说的。对于自定义的对象,容器容纳了对象(比如通过insert或pu原创 2013-04-13 11:24:05 · 5895 阅读 · 1 评论 -
断言
讨论断言(assertions),一个你兵器库内非常强大的工具。以assert为基础,我们建立一个更强大的工具,帮助你建立更好的程序。我们很快就能看到,断言不仅是简单的工具/宏/函数。这是一种生活方式,一道深深的鸿沟把程序员们分成两类:了解,和不了解断言的力量。 Assert(cool); 那么,断言到底包含了什么?为什么你要重视断言?你什么时候需要用到断言,并且同样重要的原创 2013-04-13 19:39:25 · 930 阅读 · 0 评论 -
C++标准转换运算符reinterpret_cast
reinterpret_cast (expression)reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。什么是无关类型?我没有弄清楚,没有找到好的文档来说明类型之间到底都有些什么关系(除了类的继承以外)。后半句倒是看出了reinterpret_cast的字面意思:重新解释(类转载 2013-04-22 15:31:35 · 747 阅读 · 0 评论 -
C++ STL中的vector的内存分配与释放
1.vector的内存增长vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量原创 2013-04-13 15:56:14 · 1517 阅读 · 0 评论 -
浅谈C/C++堆栈指引——C/C++堆栈很强大
浅谈C/C++堆栈指引——C/C++堆栈很强大C/C++堆栈指引Binhua Liu 我们经常会讨论这样的问题:什么时候数据存储在飞鸽传书堆栈(Stack)中,什么时候数据存储在堆(Heap)中。我们知道,局部变量是存储在堆栈中的;debug时,查看堆栈可以知道函数的调用顺序;函数调用时传递参数,事实上是把参数压入堆栈,听起来,堆栈象一个大杂烩。那么,堆栈(Stack转载 2013-04-13 23:07:43 · 967 阅读 · 0 评论 -
C++ 值传递、指针传递、引用传递详解
值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。指针传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作.引用传递:形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数原创 2013-04-13 23:49:23 · 896 阅读 · 0 评论 -
C/C++之define用法小结
1、define——(无参数宏定义)用法 一般形式为:#define标识符 字符串 (1)“#”表示其为预处理命令,凡是以“#”开头的都是预处理命令;“define”为宏定义命令;“标识符”为所定义的宏名;“字符串”可以是常数、表达式、字符串等。 (2)除了经常用到的如“#define MAXNUM 100”之外,还有其它多种灵活的用法,如“转载 2013-04-22 22:32:00 · 2655 阅读 · 0 评论 -
字符,字节和编码
目录(?)[+]字符,字节和编码级别:中级摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。本文的内容涵盖了“中文问题”,“乱码问题”。掌握编码问题的关键是正确地理解相关概念,编码所涉及的技术其实是很简单的。转载 2013-04-15 23:15:01 · 720 阅读 · 0 评论