03 2014 档案

摘要:红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:性质1. 节点是红色或黑色。性质2. 根是黑色。性质3. 所有叶子都是黑色(叶子是NIL节点)。性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)性质5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。以上的五个约束就为了一 阅读全文
posted @ 2014-03-31 11:02 拦云 阅读(1040) 评论(0) 推荐(0) 编辑
摘要:概述:查找算法:就是在是数据元素集合中查看是否存在于指定的关键字相等的元素。查找分为两种:静态查找和动态查找。1) 静态查找:是指在数据元素集合中查找与给定的关键字相等的元素2) 动态查找:就是指在查找过程中,如果数据元素集合中不存在与给定的关键字相等的元素,则将该元素插入到数据元素集合中。静态查找主要包括顺序表、有序顺序表和索引顺序表的查找。1) 顺序表的查找,就是指从表的第一个元素与给定关键字比较,直到表的最后。2) 有序顺序表的查找,在查找的过程中如果给定的关键字大于表的元素,就可以停止查找,说明表中不存在该元素(假设表中的元素按照关键字从小到大排列,并且查找从第一个元素开始比较)3) 阅读全文
posted @ 2014-03-30 20:51 拦云 阅读(1910) 评论(0) 推荐(0) 编辑
摘要:概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。快速排序:是目前基于比较的... 阅读全文
posted @ 2014-03-30 13:08 拦云 阅读(1179) 评论(0) 推荐(0) 编辑
摘要:linux系统为Centos 64位第一步:从http://nginx.org/download/上下载相应的版本(或者wget http://nginx.org/download/nginx-1.5.9.tar.gz直接在Linux上用命令下载)第二步:解压tar -zxvf nginx-1.5.9.tar.gz第三步:设置一下配置信息./configure --prefix=/usr/local/nginx ,或者不执行此步,直接默认配置第四步:make编译 (make的过程是把各种语言写的源码文件,变成可执行文件和各种库文件)make install安装 (make install是把这 阅读全文
posted @ 2014-03-29 20:05 拦云 阅读(106258) 评论(8) 推荐(4) 编辑
摘要:构建现代的服务器应用程序需要以某种方法同时接收数百、数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作。有许多解决方 案,但是 libevent 库和 libev 库能够大大提高性能和事件处理能力。在本文中,我们要讨论在 UNIX® 应用程序中使用和部署这些解决方案所用的基本结构和方法。libev 和 libevent 都可以在高性能应用程序中使用,包括部署在 IBM Cloud 或 Amazon EC2 环境中的应用程序,这些应用程序需要支持大量并发客户端或操作。简介许多服务器部署(尤其是 web 服务器部署)面对的最大问题之一是必须能够处理大量连接。无论 阅读全文
posted @ 2014-03-29 11:21 拦云 阅读(3773) 评论(1) 推荐(1) 编辑
摘要:用wget指令直接下载libevent:# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz然后,在配置时需要指定一个安装路径,即./configure –prefix=/usr;然后make;然后make install;详细的方法如下:# cd /tmp# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz# tar zxvf libevent-1.2.tar.gz# cd libevent-1.2# ./configure –prefix=/usr# make# make 阅读全文
posted @ 2014-03-29 10:43 拦云 阅读(85912) 评论(1) 推荐(1) 编辑
摘要:在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。和纯粹的面向对象程序设计语言不同,C++中的多态有着更广泛的含义。除了常见的通过类继承和虚函数机制生效于运行期的动态多态(dynamic polymorphism)外,带变量的宏,模板,函数重载,运算符重载,拷贝构造等也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为静态多态(static polymorphism)。静态多态性1、函数重载与缺省参数(1)函数重载的实现原理假设,我们现在想要写一个函数(如Exp01),它即可以计算整型数据又可以计算浮点数,那样我们就得 阅读全文
posted @ 2014-03-28 18:41 拦云 阅读(57492) 评论(4) 推荐(6) 编辑
摘要:当我们越来越多的使用C++的特性,将越来越多的问题和事物抽象成对象时,我们不难发现:很多对象都具有共性。比如数值可以增加、减少;字符串也可以增加减少。它们的动作是相似的,只是对象的类型不同而已。C++提供了“模板”这一特性,可以将“类型”参数化,使得编写的代码更具有通用性。因此大家都称模板编程为“通用编程”或“泛型编程”。一般而言,模板分为函数模板和类模板,下面就让我们分别来了解一下它们。一、函数模板1、函数模板的定义和使用定义一个模板函数的格式并不复杂,如下:template返回类型函数名(函数参数列表){//code...}下面,让我们来举一个例子来说明模板函数的作用和用法(具体代码见Ex 阅读全文
posted @ 2014-03-28 09:44 拦云 阅读(5097) 评论(0) 推荐(0) 编辑
摘要:一、什么是字节对齐,为什么要对齐 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐, 阅读全文
posted @ 2014-03-28 09:02 拦云 阅读(420) 评论(0) 推荐(1) 编辑
摘要:extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。 这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern 阅读全文
posted @ 2014-03-28 08:33 拦云 阅读(1719) 评论(0) 推荐(0) 编辑
摘要:原文来自:http://blog.sina.com.cn/s/blog_5f8817250100i3oz.html这里并没不是讨论大学课程中所学的《编译原理》,只是写一些我自己对C++编译器及链接器的工作原理的理解和看法吧,以我的水平,还达不到讲解编译原理(这个很复杂,大学时几乎没学明白)。要明白的几个概念:1、编译:编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过,就会把对应的CPP转换成OBJ文件。2、编译单元:根据C++标准,每一个CPP文件就是一个编译单元。每个编译单元之间是相互独立 阅读全文
posted @ 2014-03-27 22:52 拦云 阅读(3224) 评论(0) 推荐(0) 编辑
摘要:本文转自作者:huangguisu1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回这个期间客户端浏览器不能干任何事异步:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 例如 ajax请求(异步):请求 阅读全文
posted @ 2014-03-25 19:54 拦云 阅读(7612) 评论(0) 推荐(1) 编辑
摘要:Linux操作系统中的IO函数主要有read(),write(),recv(),send(),recvmsg(),sendmsg(),readv(),writev().接收数据的recv()函数#include#includessize_t recv(int s,void *buf,size_t len,int flags);该函数从套接字s中接收数据放到缓冲区buf中,buf的长度是len,操作的方式由flags指定。因此,第一个参数s是套接口文件描述符,它是由系统调用socket()返回的,第二个参数buf是一个指针,指向接收网络数据的缓冲区,第三个参数len以字节为单位来表示缓冲区的大小 阅读全文
posted @ 2014-03-25 19:26 拦云 阅读(2393) 评论(0) 推荐(0) 编辑
摘要:关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素、顺序容器通过元素在容器中的位置顺序存储和访问元素。因此,关联容器不提供front、push_front、pop_front、back、push_back以及pop_back,此外对于关联容器不能通过容器大小来定义,因为这样的话将无法知道键所对应的值什么。两个基本的关联容器类型是map和set。map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。set和map类型的对象不允许为同一个键添加第二个元素。如果一个键必须对应多个实例,则需使用mu 阅读全文
posted @ 2014-03-24 20:23 拦云 阅读(3332) 评论(0) 推荐(0) 编辑
摘要:容器,迭代器与容器适配器所谓容器,即是将最常运用的一些数据结构(data structures)用类模板实现出来,用于容纳特定类型的对象。根据数据在容器中排列的特性,容器可概分为序列式(sequence)和关联式(associative)两种。容器的好处,那就是它不需要你预先告诉它你要存储多少对象,只要你创建一个容器对象,并合理的调用它所提供的方法,所有的处理细节将由容器来自身完成,它可以为你申请内存或释放内存,并且用最优的算法来执行您的命令。迭代器是一种检查容器内元素并遍历元素的数据类型,它提供类似指针的功能,用于对容器的内容进行走访。适配器是使一事物的行为类似于另一事物的行为的一种机制,是 阅读全文
posted @ 2014-03-24 16:21 拦云 阅读(460) 评论(0) 推荐(0) 编辑
摘要:只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数叫做复制构造函数(有时也称为拷贝构造函数),例如:class Person{public: Person();//默认构造函数 Person(const Person&);//复制构造函数 ....................};与默认构造函数一样,复制构造函数可由编译器隐式调用,它主要用于以下几种情况:(1)根据另一个同类型的对象显示或者隐式初始化一个对象(2)复制一个对象,将它作为实参传给一个函数(3)从函数返回时复制一个对象(4)初始化顺序容器中的对象(5)根据元素初始化式列表初始化数组元素C 阅读全文
posted @ 2014-03-23 23:33 拦云 阅读(378) 评论(0) 推荐(0) 编辑
摘要:三次握手:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图下所示:(1) 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。(2) 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。(3) 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。完成三次 阅读全文
posted @ 2014-03-23 13:03 拦云 阅读(505) 评论(0) 推荐(1) 编辑
摘要:我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另外几个线程每个线程负责和一个网络主机通信。信号处理函数是同一个进程地址空间中的多个控制流程,多线程也是如此,但是比信号处理函数更加灵活,信号处理函数的控制流程只是在信号递达时产生,在处理完信号之后就 阅读全文
posted @ 2014-03-22 23:59 拦云 阅读(935) 评论(0) 推荐(0) 编辑
摘要:信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制,它用在一个或多个进程之间传递异步信号,信号可以由各种异步事件产生,如:键盘中断等等,在Linux 的shell 中,也可以使用信号将作业控制命令传递给它的子进程。在linux系统中,定义了一系列的信号,这些信号可以由内核产生,也可以有系统中的其他进程产生,只要这些进程的权限足够大。进程可以屏蔽掉大多数的信号,除了SIGSTOP和SIGKILL,前者使一个正在运行的进程暂停,后者则使一个正在运行的进程退出。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是SIG_IGN 阅读全文
posted @ 2014-03-22 21:46 拦云 阅读(397) 评论(0) 推荐(0) 编辑
摘要:linux进程间通信(IPC)包括3种机制:消息队列、信号量、共享内存。消息队列和信号量均是内核空间的系统对象,经由它们的数据需要在内核和用户空间进行额外的数据拷贝;而共享内存和访问它的所有应用程序均同处于用户空间,应用进程可以通过地址映射的方式直接读写内存,从而获得非常高的通信效率。在GNU/Linux中所有的进程都有唯一的虚拟地址空间,而共享内存应用编程接口API允许一个进程使用公共内存区段。如果使用消息队列进行通信,那么一个进程要向队列中写入消息,这要引起从用户地址空间向内核地址空间的一次复制,同样一个进程进行消息读取时也要进行一次复制,而共享内存的优点是完全省去了这些操作。两个不同进程 阅读全文
posted @ 2014-03-19 22:09 拦云 阅读(1160) 评论(0) 推荐(0) 编辑
摘要:信号量当我们在多用户系统,多进程系统,或是两者混合的系统中使用线程操作编写程序时,我们经常会发现我们有段临界代码,在此处我们需要保证一个进程(或是一个线程的执行)需要排他的访问一个资源。信号量有一个复杂的编程接口。幸运的是,我们可以很容易的为自己提供一个对于大多数的信号量编程问题足够高效的简化接口。为了阻止多个程序同时访问一个共享资源所引起的问题,我们需要一种方法生成并且使用一个标记从而保证在临界区部分一次只有一个线程执行。线程相关的方法,我们可以使用互斥或信号量来控制一个多线程程序对于临界区的访问。编写通用目的的代码保证一个程序排他的访问一个特定的资源是十分困难的,尽管有一个名为Dekker 阅读全文
posted @ 2014-03-19 16:13 拦云 阅读(775) 评论(0) 推荐(0) 编辑
摘要:函数的形参为函数提供了已命名的局部存储空间,它是在函数的形参表中定义的,并由调用函数时传递给函数的实参初始化,而形参的初始化与变量的初始化一样,如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它只是实参的别名,具体分析如下:1.非引用形参普通的非引用类型的参数通过复制对应的实参实现初始化,而当实参副本初始化形参时,函数并没有访问所传递的实参本身,因此这不会改变实参的值,例如:int fun(int v1,int v2){ while(v2) { int temp=v2; v2=v1%v2; v1=temp; } return v1;}while循环体虽然修改了v1和v... 阅读全文
posted @ 2014-03-18 23:35 拦云 阅读(581) 评论(0) 推荐(0) 编辑
摘要:消息队列是内核地址空间中的内部链表,通过linux内核在各个进程之间传递内容,消息顺序地发送到消息队列中,并且以几种不同的方式从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识,内核中的消息队列是通过IPC的标识符来区别的,不同的消息队列之间是相互独立的,每个消息队列中的消息又构成一个独立的链表.消息队列中的数据结构1、消息缓冲结构向消息队列发送消息时,必须组成合理的数据结构。Linux系统定义了一个模版数据结构msgbuf:#includestruct msgbuf{long type;char mtext[1];}其中type表示消息的类型,以正数表示。mtext是该消息的数据,并 阅读全文
posted @ 2014-03-18 19:53 拦云 阅读(16879) 评论(2) 推荐(1) 编辑
摘要:管道是一种把两个进程之间的标准输入和标准输出连接起来的机制,从而提供一种让多个进程间通信的方法,当进程创建管道时,每次都需要提供两个文件描述符来操作管道。其中一个对管道进行写操作,另一个对管道进行读操作。对管道的读写与一般的IO系统函数一致,使用write()函数写入数据,使用read()读出数据。#includeint pipe(int filedes[2]);返回值:成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道。必须在fork()中调用pipe(),否则子进程不会继承文件描述符。两个进程不共享祖先进程,就不能使用pipe。但 阅读全文
posted @ 2014-03-18 16:43 拦云 阅读(128572) 评论(3) 推荐(5) 编辑
摘要:一、fork入门知识一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。 我们来看一个例子:/**fork_test.c*version1*Createdon:2010-5-29*Author:wangth*/#include#includeintmain(){ 阅读全文
posted @ 2014-03-18 12:40 拦云 阅读(965) 评论(0) 推荐(0) 编辑
摘要:ioctl( )函数本函数影响由fd参数引用的一个打开的文件。#includeint ioctl( int fd, int request, .../* void *arg */ );返回0:成功-1:出错第三个参数总是一个指针,但指针的类型依赖于request参数。我们可以把和网络相关的请求划分为6类:套接口操作文件操作接口操作ARP高速缓存操作路由表操作流系统下表列出了网络相关ioctl请求的request参数以及arg地址必须指向的数据类型:类别Request说明数据类型套接口SIOCATMARKSIOCSPGRPSIOCGPGRP是否位于带外标记设置套接口的进程ID或进程组ID获取套接 阅读全文
posted @ 2014-03-17 23:06 拦云 阅读(15837) 评论(0) 推荐(0) 编辑
摘要:在linux下用文件描述符来表示设备文件盒普通文件,文件描述符是一个整型的数据,所有对文件的操作都是通过文件描述符来实现的。文件描述符是文件系统中连接用户空间和内核空间的枢纽,当我们打开一个或者创建一个文件时,内核空间会创建相应的结构,并且生成一个整型的变量传递给用户空间的对应进程,而进程则用这个文件描述符来对文件进行操作。要注意的是,文件描述符是一个有限的资源,因此,在使用完毕后要及时释放,一般是调用close()函数来关闭的。在linux系统中有3个已经分配好的文件描述符,那就是标准输入,标准输出和标准错误,他们的文件描述符分别为0,1,2.1.open() ,create()函数在lin 阅读全文
posted @ 2014-03-17 20:56 拦云 阅读(7624) 评论(0) 推荐(0) 编辑
摘要:Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。可以参考《Linux程序设计》(英文原版为《Beginning Linux Programming》,作者是Neil Matthew和Richard Stones)第三章: Working with files。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四: 阅读全文
posted @ 2014-03-16 17:31 拦云 阅读(479) 评论(0) 推荐(0) 编辑
摘要:GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能:1 在程序中设置断点,当程序运行到断点处暂停2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显示出来3 单步执行4 运行时修改变量的值5 跟踪路径6 线程切换等等下面以以下程序为例当我们要使用GDB进行程序的调试时,在用GCC编译时需要加上-g,如下:GDB之所以能够进行程序的调试也是在于进行编译时的-g选项,当设置了这个选项的时候,GCC会向程序中塞入一下信息,作为GDB调试时的铺垫,然后GDB才能够利用这些铺垫和信息与程序交互。有两种方式可以进入GDB,一种就是直接在命令行上输入gdb,然 阅读全文
posted @ 2014-03-16 13:14 拦云 阅读(23136) 评论(0) 推荐(2) 编辑
摘要:1.套接字的基本结构struct sockaddr这个结构用来存储套接字地址。数据定义:struct sockaddr {unsigned short sa_family; /* address族, AF_xxx */char sa_data[14]; /* 14 bytes的协议地址 */};sa_family 一般来说,都是“AFINET”。sa_data 包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一切的。为了处理struct sockaddr, 程序员建立了另外一个相似的结构 struct sockaddr_in:struct sockaddr_in (“in” 阅读全文
posted @ 2014-03-11 19:51 拦云 阅读(3561) 评论(0) 推荐(0) 编辑
摘要:首先,我们应该明确的是在C++中初始化不是赋值,因为初始化是必要的,如果读取了未初始化的值将会导致不明确的行为。初始化指创建变量并且给它赋初值,而赋值则是擦除对象的当前值并用新值代替。C++支持两种初始化变量的方式:复制初始化和直接初始化: int ival(1000);//直接初始化是将初始化式放在括号里 int ival=1000;//复制初始化是用等号(=)那么这两种方式有什么区别呢?我们可以这样认为,对于内置类型来说,复制初始化和直接初始化几乎没有差别,对于类类型来讲,当创建类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制 阅读全文
posted @ 2014-03-11 12:36 拦云 阅读(4006) 评论(0) 推荐(1) 编辑
摘要:1/*0-1背包递归*/ 2#include 2 #include 3 using namespace std; 4 5 int w[]={1,3,4,5};//物品重量数组 6 int v[]={2,30,44,20};//物品价值数组 7 int contain=5;//背包容量 8 int y[4]={-1,-1,-1,-1};//解向量,y[i]=1表示选取物品,y[i]=0表示不选取物品 9 10 int f(int n,int contain)11 {12 if(n==0 || contain==0){//当物品数量为0,或者背包容量为0时,最优解为013 ... 阅读全文
posted @ 2014-03-10 23:45 拦云 阅读(2510) 评论(0) 推荐(1) 编辑
摘要:引用只是对象的另一个名字,通过在变量名前面添加"&”符号来定义,而指针保存的是另一个对象的地址,它们两都提供了间接访问所服务变量的途径。但是它们的差别还是挺大的: 先从它们的值说起,一个有效的指针值通常具有三种面孔,一是保存一个特定对象的地址,而且一般是用取地址符号“&”把该特定对象的地址拿出来赋给指针;二是0值,此时表明它不指向任何对象,尽管任一个int型变量的值可能为0,但是直接把int型变量赋给指针是非法的,不过,如果是在编译时可以获得0值的const变量则指针对它网开一面,也就是说,int s=0;int *p=s 是不行的,但是 const int s=0; 阅读全文
posted @ 2014-03-10 23:29 拦云 阅读(2176) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示