
C/C++学习笔记
文章平均质量分 74
寂寞的泡面
我只是一个快乐的程序员。
展开
-
细谈C/C++中的前置++和后置++
++运算符是大家都再熟悉不过的东西了,无论是在for循环里,还是在一些赋值语句中,都有++的身影。这里我和大家分享一下我对++的理解,若有不足之处欢迎批评指正啊。首先,看这样一段代码:#include using namespace std;int main(){ int i; ++++i; // All Right //i++++; // error C2105: '++' needs l-value //++i=10; // All Right原创 2011-02-27 14:22:00 · 4638 阅读 · 0 评论 -
linux库文件编写
静态库与动态库的区别: 如果程序是在编译时加载库文件的,就是使用了静态库。如果是在运行时加载目标代码,就成为动态库。换句话说,如果是使用静态库,则静态库代码在编译时就拷贝到了程序的代码段,程序的体积会膨胀。如果使用动态库,则程序中只保留库文件的名字和函数名,在运行时去查找库文件和函数体,程序的体积基本变化不大。静态库的原则是“以空间换时间”,增加程序体积,减少运行时间;动态库则是“以时间换空间”,增加了运行时间,但减少了程序本身的体积。其实,程序设计就是一个“时间与空间的矛盾”。下面我们就以实际例原创 2011-02-05 22:12:00 · 2970 阅读 · 1 评论 -
细谈const char ** 与 char ** 的区别
<br />#include "stdafx.h"#include <iostream>using namespace std;int main(int argc, char* argv[]){ const char ** p0=NULL; char ** p1=NULL; p0=p1;}// error C2440: “=”: 无法从“char **”转换为“const char **”<br /> 程序出现了错误,很明显是类型转换时类型不匹配(const原创 2011-01-12 19:21:00 · 4886 阅读 · 0 评论 -
细谈C++中的new和delete
/*****************************************************************************//* C++中的 new / delete *//*****************************************************************************//* new的3种形态: new o转载 2010-12-31 21:01:00 · 1630 阅读 · 0 评论 -
搭建linux C语言开发环境——redhat9+vim+ctags+taglist+cscope
搭建linux C语言开发环境——vim+ctags原创 2011-01-02 00:20:00 · 9972 阅读 · 1 评论 -
linux下Epoll实现简单的C/S通信
<br />epoll的优点:<br />1.支持一个进程打开大数目的socket描述符(FD)<br /> select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是2048。对于那些需要支持的上万连接数目的IM服务器来说显然太少了。这时候你一是可以选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降,二是可以选择多进程的解决方案(传统的 Apache方案),不过虽然linux上面创建进程的代价比较小,但仍旧是不可忽视的,加上进程间数据原创 2010-12-28 20:27:00 · 20022 阅读 · 4 评论 -
细谈select函数(C语言)
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不原创 2010-11-06 16:50:00 · 154552 阅读 · 26 评论 -
socket编程小问题:地址已经被使用——Address already in use
很多socket编程的初学者可能会遇到这样的问题:如果先ctrl+c结束服务器端程序的话,再次启动服务器就会出现Address already in use这个错误,或者你的程序在正常关闭服务器端socket后还是有这个问题。正如下面的这段简单的socket程序。server.c#include #include #include #include #include #include #include #define BUFFER_SIZE 40int mai原创 2010-12-25 22:07:00 · 115185 阅读 · 9 评论 -
细谈C语言中的main返回值
<br /> C语言几乎是所有人的第一个编程语言,而main函数则又是我们接触到的第一个函数。我们的所有程序都需要main函数,对于下面的代码,相信大家再熟悉不过了。<br /> #include <stdio.h>void main(){ printf("I am main function./n");}<br /> <br />接下来再看一段很相似的代码。<br />#include <stdio.h>int main(){ printf("I am mai原创 2010-11-04 10:00:00 · 33351 阅读 · 9 评论 -
细谈C++中的new和malloc
new和malloc的区别:1、new 是c++中的操作符,malloc是c 中的一个函数2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。4、new 和 malloc效率比较new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而m原创 2010-11-01 16:19:00 · 1902 阅读 · 1 评论 -
细谈volatile限定符——上海先锋商泰面试归来
volatile的本意是“易变的”,由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如: static int i=0; int main(void) { ... while (1) { if (i) dosomething(); } } /* Interrupt service routine. */ void ISR_2(void) { i=1; } 程序的本意是原创 2010-10-31 09:39:00 · 4410 阅读 · 1 评论 -
细谈linux下的posix多线程编程
下面实现一个简单的多线程编程的例子。#include #include #include #include #include char message[]="Hello World!";void * thread_function(void * arg);int main(){ pthread_t second_thread; void * thread_result; // create new thread if(pthread_create(原创 2010-12-22 13:15:00 · 2298 阅读 · 0 评论 -
windows下DLL的编写
<br /> 在VC中新建一个空的Win32动态链接库工程(Win32 Domanic-Link Library),然后添加一个C++ Sourse File到工程,我这里的文件名取DllTest.cpp。然后在文件中添加如下内容: //DllTest.cpp _declspec(dllexport) int add(int a,int b)<br /> {<br /> return a+b;<br /> } _declspec(dllexport) int subtract(int转载 2011-02-09 21:09:00 · 5141 阅读 · 0 评论 -
FactoryPattern——创建型模式
<br /><br />以下代码已经在VC6.0中测试运行通过。<br />factory.h<br />#ifndef _FACTORY_H_#define _FACTORY_H_#include <string>using namespace std;class Fruit;class Factory{protected: Factory(){};public: virtual ~Factory() = 0; virtual Fruit* Crea原创 2011-03-20 19:56:00 · 2007 阅读 · 0 评论 -
Observer模式——行为模式
<br /><br />observer.h<br />#ifndef _OBSERVER_H_#define _OBSERVER_H_#include <string>using namespace std;typedef string State;class Subject;class Observer{public: virtual ~Observer(); virtual void Update(Subject* sub) = 0; vir原创 2011-04-15 20:14:00 · 2936 阅读 · 6 评论 -
linux下C语言操作mysql数据库(系统自带版本3.23.54)
我的上一篇blog介绍了在linux环境下如何安装配置系统自带的mysql数据库,并列举了mysql的一些简单的操作。接下来我将介绍一下如何利用mysql提供给我们的API来访问并操作mysql数据库(C语言)。首先,我们需要安装mysql-devel-3.23.54a-11.i386.rpm包,这样我们才能使用mysql提供的API和类库。mysql-devel-3.23.54a-11.i386.rpm的下载地址:http://www.rpmfind.net/linux/rpm2html/se原创 2011-04-12 23:58:00 · 4415 阅读 · 0 评论 -
Flyweight模式——结构型模式
<br /><br /> <br />flyweight.h<br />#ifndef _FLY_WEIGHT_H_#define _FLY_WEIGHT_H_#include <string>using namespace std;class Flyweight{protected: Flyweight(string intrinsic_state);public: virtual void Operation(const string& extrinsic_s原创 2011-04-05 09:12:00 · 2413 阅读 · 0 评论 -
Strategy模式——行为模式
<br /><br /> <br />strategy.h<br />#ifndef _STRATEGY_H_#define _STRATEGY_H_class Strategy{public: virtual ~Strategy(); virtual void AlgrithmInterface()=0;protected: Strategy();};class ConcreteStrategyA:public Strategy{public:原创 2011-03-31 21:55:00 · 2147 阅读 · 0 评论 -
Facade模式——结构型模式
外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。facade.h#ifndef _FACADE_H_#define _FACADE_H_class SubSystem1;class SubSystem2;class Facade{public: ~Facade(); static Facade* Instance(); void OperationWrapper();protected: Facade();priv原创 2011-03-26 01:28:00 · 2095 阅读 · 0 评论 -
Template模式——行为模式
<br /><br />template.h<br />#ifndef _TEMPLATE_H_#define _TEMPLATE_H_class AbstractClass{public: virtual ~AbstractClass(); void TemplateMethod();protected: AbstractClass(); virtual void PrimitiveOperation1()=0; virtual void PrimitiveOp原创 2011-03-28 17:50:00 · 2031 阅读 · 0 评论 -
Proxy模式——结构性模式
<br /><br /> <br />proxy.h<br />#ifndef _PROXY_H_#define _PROXY_H_class Subject{public: virtual ~Subject(); virtual void Request()=0;protected: Subject();};class ConcreteSubject:public Subject{public: ConcreteSubject(); ~Con原创 2011-03-27 15:21:00 · 2030 阅读 · 0 评论 -
Adapter模式——结构型模式
<br /><br /> <br />adapter.h<br />#ifndef _ADAPTER_H_#define _ADAPTER_H_class Target{public: Target(); virtual ~Target(); virtual void Request();};class Adaptee{public: Adaptee(); ~Adaptee(); void SpecificRequest();};c原创 2011-03-24 20:29:00 · 2009 阅读 · 0 评论 -
Bridge模式——结构型模式
<br /><br /> <br />tank.h<br />#ifndef _TANK_H_#define _TANK_H_class TankImpl;class Tank{public: virtual ~Tank(); virtual void shot()=0; virtual void run()=0;protected: Tank();};class ChinaTank:public Tank{public: ChinaT原创 2011-03-23 19:51:00 · 2012 阅读 · 0 评论 -
Bridge模式——结构型模式
<br /><br /> <br />tank.h<br />#ifndef _TANK_H_#define _TANK_H_class TankImpl;class Tank{public: virtual ~Tank(); virtual void shot()=0; virtual void run()=0;protected: Tank();};class ChinaTank:public Tank{public: ChinaT原创 2011-03-23 19:33:00 · 1828 阅读 · 0 评论 -
Singleton模式——创建型模式
<br /><br /> <br />Singleton.h<br />#ifndef _SINGLETON_H_#define _SINGLETON_H_class Singleton{public: virtual ~Singleton(); static Singleton* Instance();protected: Singleton();private: static Singleton* m_instance;};#endif<br />原创 2011-03-22 22:09:00 · 2124 阅读 · 4 评论 -
AbstractFactory模式——创建型模式
<br /><br />factory.h<br />#ifndef _ABSTRACT_FACTORY_H_#define _ABSTRACT_FACTORY_H_class Product;class AbstractFactory{protected: AbstractFactory();public: virtual ~AbstractFactory()=0; virtual Product* CreateProductA()=0; virtual P原创 2011-03-21 12:10:00 · 1979 阅读 · 0 评论 -
计算n!中结尾零的个数——上海先锋商泰面试归来
编程实现:计算n!中结尾零的个数。/*计算n!中结尾零的个数,返回结尾零的个数。*/int CalZeroNum(int n);原创 2010-10-30 20:17:00 · 8674 阅读 · 5 评论 -
寻找二叉树中两个节点的最近的公共祖先——迅雷笔试归来
迅雷的笔试可真让人煎熬啊,题量很大,而且考试时间是三个小时。不过迅雷的题目质量很高,既考查了基础知识又不乏高难的数据结构和算法题目。下面和大家分享两道算法编程题,代码没有在编译器上调试,可能会出现一点小bug,感兴趣的朋友可以编译调试一下。题目1:将一个单链表逆转——原来的头指针变为尾指针,原来的尾指针变为头指针。算法思想:从链表的头结点开始依次逆转,最终将整个链表逆转。程序代码:/*节点的类定义*/class Node{ Node * next;};/*链表的类定义*/原创 2010-10-28 10:38:00 · 10689 阅读 · 10 评论 -
分享两道华为的C语言上机题——包含答案。
2010年华为软件校园招聘编程测验类别:软件C语言编程题(共2题,第一题40分,第二题60分,共100分。请上机编写程序,按题目要求提交文件。[详见考试说明]本试题采用自动测试用例进行评分,测试用例不对考生公开,凡不满足提交要求导致不能运行或用例不通过,不予评分)。1. 删除字符串中所有给定的子串(40分)问题描述: 在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。要求实现函数: int delete_sub_str(const char *str, const char *su原创 2010-10-15 11:44:00 · 15029 阅读 · 7 评论 -
比较带参宏与函数的异同
<br /><br />编译器是在程序的预编译阶段对宏进行处理的,主要是用预编译指令来替换源文件中的宏。<br /> <br />1.宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已。<br /><br />2.宏进行定义时不会考虑参数的类型。<br /><br />3.参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小。<br /><br />4.参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。<br /><br />5原创 2010-10-11 09:41:00 · 4505 阅读 · 0 评论 -
extern "C"的用法
C++中extern "C"的设立动机是实现C++与C及其它语言的混合编程。 C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y); 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。该函数被C编译器编译后在库中的名字为_foo,而C++编译原创 2010-10-12 11:02:00 · 865 阅读 · 0 评论 -
C语言的编译过程
“C语言的编译过程”是我在大一时学习C语言这门课的第一课的内容,当时刚接触到编程语言,同时对计算机的底层运作原理以前不同。所以这第一节课让我感到甚是迷茫。在经过几年的学习后我再次翻开"c语言程序设计"这本书,对当初困扰我的这个问题做了一些研究,同时收集了一些资料。这里与大家分享一下研究成果。C语言编译过程总结详解 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链原创 2010-10-11 09:58:00 · 998 阅读 · 0 评论 -
多线程环境下对变量的读写操作的原子性问题(一道百度笔试题引发的思考)
最近天天专注于复习专业课知识,准备迎接十月份的校园招聘。在网上看了几套百度的笔试试题,其中有一道给我留下了深刻的印象。题目如下:以下多线程对int型变量x的操作,哪几个需要进行同步:( )A. x=y; B. x++; C. ++x; D. x=1;从表面看上去实在是看不出什么突破口,我们不妨将这些代码译成汇编语言再来分析。01 x = y; 02 mov eax,dword ptr [y] 03 mov dword ptr [x],eax 04 05 x++; 06 mov eax,dword p原创 2010-10-06 23:06:00 · 2684 阅读 · 0 评论 -
C++数组--详细分析
<br />1、数组下标:<br /> (1)在定义时必须明确。<br /> ①只能用正整数或const常量,静态或全局变量不可以;例如:const int length=5; int array[length];<br /> ②(特) 在new时可以用变量做下标。例如:int * array = new int[variable];<br /> (2)在初始化时:<br /> ①一维数组,可略; 例如:int array[]原创 2010-10-03 13:19:00 · 11057 阅读 · 1 评论 -
各种内排序算法的C++实现(不断更新中)
一.插入排序(insert sorting)#include using namespace std;/*交换函数,作用是交换数组中的两个元素的位置*/void swap(int array[],int i,int j){ int tmp=array[i]; array[i]=array[j]; array[j]=tmp;}void insertSort(int array[],int n){ for(int i=1;i { for(int j=i;j>0;j--) { if(array[j]>ar原创 2010-09-28 14:18:00 · 36256 阅读 · 17 评论 -
c/c++程序的内存分配
<br />首先,需要搞清楚:变量的类型和它的存储类别是两个概念。 <br /><br />数据类型和内存管理没有直接的关系。 <br /><br />一个由C/C++编译的程序占用的内存分为以下几个部分: <br /><br />1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 <br /><br />2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是原创 2010-09-28 01:13:00 · 1739 阅读 · 3 评论 -
iostream与iostream.h的不解情缘
C++中新定义的方法都是有名字空间的 比如cout就属于std名字空间 如果include头文件的时候加上.h,默认会using namespace 否则需要自己加上 using namespace XXX 对于C中已经定义的方法如printf,没有影响的iostream.h是包含输入/输出流处理的头文件,iostream就什么都不是了 但用iostream要加名词空间namespace#include或者是 #includeusing namespace std; 二者都行#include是C原创 2010-09-26 15:49:00 · 920 阅读 · 1 评论 -
C++引用与指针的比较
C++引用与指针的比较引用是C++中的概念,初学者容易把引用和指针混淆一起。 一下程序中,n是m的一个引用(reference),m是被引用物(referent)。 int m; int &n = m; n相当于m的别名(绰号),对n的任何操作就是对m的操作。 所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。 引用的规则: (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。 (2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。 (3)一旦引用被初始原创 2010-09-17 14:54:00 · 713 阅读 · 0 评论 -
C++中static总结
C++中const总结对于基本声明1. const int r=100; //标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域为此文件,只能被此文件使用,编译器经过类型检查后直接用100在编译时替换2. extern const int r=100; //将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义3. const int r[ ]={1,2,3,4};struct S {int a,b;};c原创 2010-09-17 14:53:00 · 1042 阅读 · 0 评论 -
话说C语言的const
const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable)。我们来分情况看语法上它该如何被使用。1、函数体内修饰局部变量。例:void func(){const int a=0;}首先,我们先把const这个单词忽略不看,那么a是一个int类型的局部自动变量,我们给它赋予初始值0。然后再看const.const作为一个类型限定词,和int有相同的地位。const int a;int const a;是等价的。于是此处我们一定要清晰的明白,const修饰的原创 2010-09-17 10:31:00 · 1137 阅读 · 0 评论