﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-    Update 牌...@ Blog-随笔分类-C++基础</title><link>http://www.cppblog.com/Lee7/category/4849.html</link><description>  当华美的叶片落尽，生命的脉络才历历可见。 －－ 聂鲁达    
</description><language>zh-cn</language><lastBuildDate>Sun, 14 Jun 2009 08:50:21 GMT</lastBuildDate><pubDate>Sun, 14 Jun 2009 08:50:21 GMT</pubDate><ttl>60</ttl><item><title>C/C++中Static的作用详述</title><link>http://www.cppblog.com/Lee7/archive/2009/03/01/75263.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Sun, 01 Mar 2009 14:07:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2009/03/01/75263.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/75263.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2009/03/01/75263.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/75263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/75263.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 首先static的最主要功能是隐藏，其次因为static变量存放在静态存储区，所以它具备持久性和默认值0.&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2009/03/01/75263.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/75263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2009-03-01 22:07 <a href="http://www.cppblog.com/Lee7/archive/2009/03/01/75263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>变长结构体</title><link>http://www.cppblog.com/Lee7/archive/2009/02/19/74340.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Thu, 19 Feb 2009 14:50:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2009/02/19/74340.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/74340.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2009/02/19/74340.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/74340.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/74340.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2009/02/19/74340.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/74340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2009-02-19 22:50 <a href="http://www.cppblog.com/Lee7/archive/2009/02/19/74340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BOOL和bool的区别</title><link>http://www.cppblog.com/Lee7/archive/2008/12/14/69394.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Sun, 14 Dec 2008 04:28:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/12/14/69394.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/69394.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/12/14/69394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/69394.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/69394.html</trackback:ping><description><![CDATA[一、 <br>1、类型不同 <br>BOOL为int型 <br>bool为布尔型 <br>2、长度不同 <br>bool只有一个字节 <br>BOOL长度视实际环境来定，一般可认为是4个字节 <br>3、取值不同 <br>bool取值false和true，是0和1的区别 <br>BOOL取值FALSE和TRUE，是0和非0的区别 <br>二： <br>bool是标准C++数据类型，可取值true和false。单独占一个字节， <br>如果数个bool对象列在一起，可能会各占一个bit，这取决于编译器。 <br><br>BOOL是微软定义的typedef int BOOL。与bool不同，它是一个三值逻辑， <br>TRUE/FALSE/ERROR，返回值为&gt;0的整数为TRUE，0为FALSE，-1为ERROR。 <br>Win32 API中很多返回值为BOOL的函数都是三值逻辑。比如GetMessage(). <br>三： <br>大BOOL和小bool之间的区别： <br>1、类型不同 <br>BOOL为int型 <br>bool为布尔型 <br>2、长度不同 <br>bool只有一个字节 <br>BOOL长度视实际环境来定，一般可认为是4个字节 <br>3、取值不同 <br>bool取值false和true，是0和1的区别 <br>BOOL取值FALSE和TRUE，是0和非0的区别 <br>4、例子 <br>bool x=3;&nbsp; //告警 <br>bool x=1;&nbsp; //正确 <br>BOOL x=3;&nbsp; //正确 <br>BOOL x=3.3;&nbsp; //告警 <br>注：windows为了兼容问题定义的基础变量。 <br>typedef unsigned long&nbsp; &nbsp; &nbsp; &nbsp; DWORD; <br>typedef int&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BOOL; <br>typedef unsigned char&nbsp; &nbsp; &nbsp; &nbsp; BYTE; <br>typedef unsigned short&nbsp; &nbsp; &nbsp; WORD; <br>typedef float&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FLOAT; <br>typedef FLOAT&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *PFLOAT; <br>typedef BOOL near&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *PBOOL; <br>typedef BOOL far&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *LPBOOL; <br>typedef BYTE near&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *PBYTE; <br>typedef BYTE far&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *LPBYTE; <br>typedef int near&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *PINT; <br>typedef int far&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *LPINT; 
<img src ="http://www.cppblog.com/Lee7/aggbug/69394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-12-14 12:28 <a href="http://www.cppblog.com/Lee7/archive/2008/12/14/69394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构复习笔记</title><link>http://www.cppblog.com/Lee7/archive/2008/11/24/67741.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Mon, 24 Nov 2008 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/11/24/67741.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/67741.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/11/24/67741.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/67741.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/67741.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本科期间居然没有开数据结构的课程！最近自学了这些，整理笔记可以分享下！&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/11/24/67741.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/67741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-11-24 16:44 <a href="http://www.cppblog.com/Lee7/archive/2008/11/24/67741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆和栈的区别在哪里？      </title><link>http://www.cppblog.com/Lee7/archive/2008/11/14/66925.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Fri, 14 Nov 2008 08:12:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/11/14/66925.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/66925.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/11/14/66925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/66925.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/66925.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-line-height-rule: exactly"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">堆和栈</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的区别在哪里？</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">哪些变量会在栈中分配空间，哪些变量会在堆中分配空间</span><span lang=EN-US style="FONT-SIZE: 9pt">? &nbsp; &nbsp; &nbsp; <br>&nbsp; --------------------------------------------------------------- &nbsp; &nbsp; &nbsp; <br>&nbsp; 1</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、<span style="COLOR: maroon">申请方式</span></span><span style="FONT-SIZE: 9pt; COLOR: maroon"> </span><span lang=EN-US style="FONT-SIZE: 9pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; stack: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由系统<span style="COLOR: red">自动分配</span>。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如，声明在函数中一个局部变量</span><span style="FONT-SIZE: 9pt"> <span lang=EN-US>&nbsp; &nbsp; int &nbsp; &nbsp; b; &nbsp; &nbsp; </span></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统自动在栈中为</span><span lang=EN-US style="FONT-SIZE: 9pt">b</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开辟空间</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; heap: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要程序员<span style="COLOR: red">自己申请，并指明大小</span>，在</span><span lang=EN-US style="FONT-SIZE: 9pt">c</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span><span lang=EN-US style="FONT-SIZE: 9pt">malloc</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如</span><span lang=EN-US style="FONT-SIZE: 9pt">p1 = (char *)malloc(10); &nbsp; &nbsp; //free&nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang=EN-US style="FONT-SIZE: 9pt">C++</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中用</span><span lang=EN-US style="FONT-SIZE: 9pt">new</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运算符</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //delete<br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如</span><span lang=EN-US style="FONT-SIZE: 9pt">p2 = (char *)malloc(10); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是注意</span><span lang=EN-US style="FONT-SIZE: 9pt">p1</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 9pt">p2</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身是在栈中的。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; <br>&nbsp; 2</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、<span style="COLOR: maroon">申请后系统的响应</span></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: maroon"> &nbsp;</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">栈：</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只要栈的剩余空间大于所申请空间，系统将为程序提供内存，否则将报异常提示<span style="COLOR: red">栈溢出</span>。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">堆：</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先应该知道操作系统有一个<span style="COLOR: red">记录空闲内存地址的链表</span>，当系统收到程序的申请时，</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会遍历该链表，寻找第一个空间大于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该结点的空间分配给程序，另外，对于大多数系统，会在这块内存空间中的首地址处记录本次分配的大小，这样，代码中的</span><span lang=EN-US style="FONT-SIZE: 9pt">delete</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句才能正确的释放本内存空间。另外，由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部分重新放入空闲链表中。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; <br>&nbsp; 3</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、<span style="COLOR: maroon">申请大小的限制</span></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: maroon"> &nbsp; </span><span lang=EN-US style="FONT-SIZE: 9pt">&nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">栈：</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang=EN-US style="FONT-SIZE: 9pt">Windows</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下</span><span lang=EN-US style="FONT-SIZE: 9pt">,</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的，在</span><span lang=EN-US style="FONT-SIZE: 9pt">WINDOWS</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下，栈的大小是</span><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="m"><span lang=EN-US style="FONT-SIZE: 9pt">2M</span></st1:chmetcnv><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（也有的说是</span><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1" UnitName="m"><span lang=EN-US style="FONT-SIZE: 9pt">1M</span></st1:chmetcnv><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，总之是一个编译时就确定的<span style="COLOR: red">常数</span>），如果申请的空间超过栈的剩余空间时，将提示</span><span lang=EN-US style="FONT-SIZE: 9pt">overflow</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。因此，能从栈获得的空间较小。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp;<span style="COLOR: red"> </span></span><span style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">堆：</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">堆是向高地址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见，<span style="COLOR: red">堆获得的空间比较灵活，也比较大</span>。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; <br>&nbsp; 4</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、<span style="COLOR: maroon">申请效率的比较：</span></span><span style="FONT-SIZE: 9pt; COLOR: maroon"> </span><span lang=EN-US style="FONT-SIZE: 9pt">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">栈由系统<span style="COLOR: red">自动分配</span>，<span style="COLOR: red">速度较快</span>。但程序员是无法控制的。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">堆是由</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: red">new</span><span style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分配的内存</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，一般<span style="COLOR: red">速度比较慢</span>，而且容易产生内存碎片</span><span lang=EN-US style="FONT-SIZE: 9pt">,</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不过用起来最方便</span><span lang=EN-US style="FONT-SIZE: 9pt">. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外，在</span><span lang=EN-US style="FONT-SIZE: 9pt">WINDOWS</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下，最好的方式是用</span><span lang=EN-US style="FONT-SIZE: 9pt">VirtualAlloc</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分配内存，他不是在堆，也不是在栈是直接在进程的地址空间中保留一快内存，虽然用起来最不方便。但是速度快，也最灵活。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; <br>&nbsp; 5</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、<span style="COLOR: maroon">堆和栈中的存储内容</span></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: maroon"> &nbsp;</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: red"> &nbsp; </span><span lang=EN-US style="FONT-SIZE: 9pt">&nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">栈：在函数调用时，第一个进栈的是主函数中后的下一条指令（函数调用语句的下一条可执行语句）的地址，然后是函数的各个参数，在大多数的</span><span lang=EN-US style="FONT-SIZE: 9pt">C</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译器中，参数是由右往左入栈的，然后是函数中的局部变量。注意静态变量是不入栈的。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当本次函数调用结束后，局部变量先出栈，然后是参数，最后栈顶指针指向最开始存的地址，也就是主函数中的下一条指令，程序由该点继续运行。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">堆：一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp; <br>&nbsp; 6</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、<span style="COLOR: maroon">存取效率的比较</span></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: maroon"> &nbsp; &nbsp; </span><span lang=EN-US style="FONT-SIZE: 9pt">&nbsp; &nbsp; &nbsp; <br>&nbsp; char &nbsp; &nbsp; s1[] &nbsp; &nbsp; = &nbsp; &nbsp; "aaaaaaaaaaaaaaa"; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; char &nbsp; &nbsp; *s2 &nbsp; &nbsp; = &nbsp; &nbsp; "bbbbbbbbbbbbbbbbb"; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; aaaaaaaaaaa</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是在运行时刻赋值的；</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而</span><span lang=EN-US style="FONT-SIZE: 9pt">bbbbbbbbbbb</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是在编译时就确定的；</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是，在以后的存取中，在栈上的数组比指针所指向的字符串</span><span lang=EN-US style="FONT-SIZE: 9pt">(</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如堆</span><span lang=EN-US style="FONT-SIZE: 9pt">)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">快。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比如：</span><span lang=EN-US style="FONT-SIZE: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;#include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_53_282_Open_Image onclick="this.style.display='none'; Codehighlighter1_53_282_Open_Text.style.display='none'; Codehighlighter1_53_282_Closed_Image.style.display='inline'; Codehighlighter1_53_282_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_53_282_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_282_Closed_Text.style.display='none'; Codehighlighter1_53_282_Open_Image.style.display='inline'; Codehighlighter1_53_282_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_53_282_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_53_282_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1234567890</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1234567890</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-line-height-rule: exactly">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">堆和栈的区别可以用如下的比喻来看出：</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用栈就象我们去饭馆里吃饭，只管点菜（发出申请）、付钱、和吃（使用），吃饱了就走，不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作，他的好处是快捷，但是自由度小。</span><span lang=EN-US style="FONT-SIZE: 9pt"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br>&nbsp;<o:p></o:p></span></p>
<img src ="http://www.cppblog.com/Lee7/aggbug/66925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-11-14 16:12 <a href="http://www.cppblog.com/Lee7/archive/2008/11/14/66925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用static声明的函数和变量小结[转]</title><link>http://www.cppblog.com/Lee7/archive/2008/11/14/66924.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Fri, 14 Nov 2008 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/11/14/66924.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/66924.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/11/14/66924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/66924.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/66924.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">用</span><span lang=EN-US style="mso-font-kerning: 0pt">static</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">声明的函数和变量小结</span><span lang=EN-US style="mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">声明的变量在</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">C</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">语言中有<span style="COLOR: red">两方面</span>的特征：</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">　　</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">1)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">、变量会被放在程序的<span style="COLOR: red">全局存储区</span>中，这样可以在下一次调用的时候还可以<span style="COLOR: red">保持原来的赋值</span>。这一点是它与堆栈变量和堆变量的区别。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">　　</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">2)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">、变量用</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">告知编译器，自己仅仅<span style="COLOR: red">在变量的作用范围内可见</span>。这一点是它与全局变量的区别。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br><span style="COLOR: red">Tips:</span><br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">　　</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">A.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">若全局变量仅在单个</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">C</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">文件中访问，则可以将这个变量修改为静态全局变量，以降低模块间的耦合度；</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">　　</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">B.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">若全局变量仅由单个函数访问，则可以将这个变量改为该函数的静态局部变量，以降低模块间的耦合度；</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">　　</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">C.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时，需要考虑<span style="COLOR: red">重入</span>问题；</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">如果我们需要一个可重入的函数，那么，我们一定要避免函数中使用</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">变量</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">(</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">这样的函数被称为：带</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">&#8220;</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">内部存储器</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">&#8221;</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">功能的的函数</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">函数中必须要使用</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">变量情况</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">:</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">比如当某函数的返回值为指针类型时，则必须是</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的局部变量的地址作为返回值，若为</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">auto</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">类型，则返回为错指针。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">函数前加</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">使得函数成为<span style="COLOR: red">静态函数</span>。但此处</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">&#8220;static&#8221;</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的含义<span style="COLOR: red">不是指存储方式</span>，而是指对函数的<span style="COLOR: red">作用域仅局限于本文件</span></span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">(</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">所以又称内部函数</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">。使用内部函数的好处是：不同的人编写不同的函数时，不用担心自己定义的函数，是否会与其它文件中的函数同名。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">扩展分析</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">:</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">术语</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">有着不寻常的历史</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">.</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">起初，在</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">C</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">中引入关键字</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">是为了表示退出一个块后仍然存在的局部变量。随后，</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">在</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">C</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">中有了第二种含义：用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字，所以仍使用</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">关键字来表示这第二种含义。最后，</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">C++</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">重用了这个关键字，并赋予它与前面不同的第三种含义：表示属于一个类而不是属于此类的任何特定对象的变量和函数</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">(</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">与</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">Java</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">中此关键字的含义相同</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt">全局变量、静态全局变量、静态局部变量和局部变量的区别</span></strong><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">变量可以分为：全局变量、静态全局变量、静态局部变量和局部变量。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">按<span style="COLOR: red">存储区域</span>分，全局变量、静态全局变量和静态局部变量都存放在内存的<span style="COLOR: red">静态存储区域</span>，局部变量存放在内存的<span style="COLOR: red">栈区</span>。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">按<span style="COLOR: red">作用域</span>分，全局变量在整个工程文件内都有效；静态全局变量只在定义它的文件内有效；静态局部变量只在定义它的函数内有效，只是程序仅分配一次内存，函数返回后，该变量不会消失；局部变量在定义它的函数内有效，但是<span style="COLOR: red">函数返回后失效</span>。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">全局变量</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">(</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">外部变量</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的说明之前再冠以</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">就构成了静态的全局变量。全局变量本身就是静态存储方式，</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">静态全局变量当然也是静态存储方式。</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序，</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">当一个源程序由多个源文件组成时，非静态的全局变量在各个源文件中都是有效的。</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">而静态全局变量则限制了其作用域，</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">即只在定义该变量的源文件内有效，</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内，只能为该源文件内的函数公用，</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">因此可以避免在其它源文件中引起错误。</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">　　从以上分析可以看出，</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">把局部变量改变为静态变量后是改变了它的存储方式即改变了它的<span style="COLOR: red">生存期</span>。把全局变量改变为静态变量后是改变了它的<span style="COLOR: red">作用域</span>，</span><span style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">限制了它的使用范围。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">　　</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">函数与普通函数作用域不同。<span style="COLOR: red">仅在本文</span>件。只在当前源文件中使用的函数应该说明为内部函数</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">(static)</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">，内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数，应该在一个头文件中说明，要使用这些函数的源文件要包含这个头文件</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">　　</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">全局变量与普通的全局变量有什么区别：</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">全局变量只初始化一次，防止在其他文件单元中被引用</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">;<br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">　　</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">局部变量和普通局部变量有什么区别：</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">局部变量只被初始化一次，下一次依据上一次结果值；</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">函数与普通函数有什么区别：</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt">static</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">函数在内存中只有一份，普通函数在每个被调用中维持一份拷贝</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">全局变量和静态变量如果没有手工初始化，<span style="COLOR: red">则由编译器初始化为</span></span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; mso-font-kerning: 0pt">0</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">。局部变量的值不可知。</span><span lang=EN-US style="FONT-SIZE: 9pt; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-FAMILY: 宋体"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/Lee7/aggbug/66924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-11-14 15:59 <a href="http://www.cppblog.com/Lee7/archive/2008/11/14/66924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> vc数据类型转换大全</title><link>http://www.cppblog.com/Lee7/archive/2008/10/23/64807.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Thu, 23 Oct 2008 06:27:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/10/23/64807.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/64807.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/10/23/64807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/64807.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/64807.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username[]="程佩君";char temp[200];char *buf;CString str;_variant_t v1;_bstr_t v2;一、其它数据类型转换为字符串&#8226; 短整型(int)ito...&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/10/23/64807.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/64807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-10-23 14:27 <a href="http://www.cppblog.com/Lee7/archive/2008/10/23/64807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>More Effective C++：指针与引用的区别</title><link>http://www.cppblog.com/Lee7/archive/2008/09/02/60717.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Tue, 02 Sep 2008 09:35:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/09/02/60717.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/60717.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/09/02/60717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/60717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/60717.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 指针与引用看上去完全不同（指针用操作符’*’和’->’，引用使用操作符’.’），但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针，在什么时候使用引用呢？<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/09/02/60717.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/60717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-09-02 17:35 <a href="http://www.cppblog.com/Lee7/archive/2008/09/02/60717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆、栈及静态数据区详解 </title><link>http://www.cppblog.com/Lee7/archive/2008/08/31/60530.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Sun, 31 Aug 2008 13:43:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/08/31/60530.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/60530.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/08/31/60530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/60530.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/60530.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在C++中，内存分成5个区，他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/08/31/60530.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/60530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-08-31 21:43 <a href="http://www.cppblog.com/Lee7/archive/2008/08/31/60530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DllMain详解</title><link>http://www.cppblog.com/Lee7/archive/2008/08/04/57927.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Mon, 04 Aug 2008 01:26:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/08/04/57927.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/57927.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/08/04/57927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/57927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/57927.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 跟exe有个main或者WinMain入口函数一样，DLL也有一个入口函数，就是DllMain。以“DllMain”为关键字，来看看MSDN帮助文档怎么介绍这个函数的。 <br>The DllMain function is an optional method of entry into a dynamic-link library (DLL)。（简要翻译：对于一个Dll模块，DllMain函数是可选的。）这句话很重要，很多初学者可能都认为一个动态链接库肯定要有DllMain函数。其实不然，像很多仅仅包含资源信息的DLL是没有DllMain函数的&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/08/04/57927.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/57927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-08-04 09:26 <a href="http://www.cppblog.com/Lee7/archive/2008/08/04/57927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++动态链接库(DLL)编程深入浅出</title><link>http://www.cppblog.com/Lee7/archive/2008/07/07/55543.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Mon, 07 Jul 2008 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/07/07/55543.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/55543.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/07/07/55543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/55543.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/55543.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:          先来阐述一下DLL(Dynamic Linkable Library)的概念，你可以简单的把DLL看成一种仓库，它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库－静态链接库－动态链接库”的时代。<br>      静态链接库与动态链接库都是共享代码的方式，如果采用静态链接库，则无论你愿不愿意，lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL，该DLL不必被包含在最终EXE文件中，EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库，而在动态链接库中还可以再包含其他的动态或静态链接库。&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/07/07/55543.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/55543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-07-07 15:39 <a href="http://www.cppblog.com/Lee7/archive/2008/07/07/55543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc dll编程</title><link>http://www.cppblog.com/Lee7/archive/2008/07/04/55361.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Fri, 04 Jul 2008 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/07/04/55361.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/55361.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/07/04/55361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/55361.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/55361.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在我们实际用软件时，经常可看到许多动态连接库。动态连接库有其自身的优点如节省内存、支持多语种等功能，而且，当DLL中的函数改变后，只要不是参数的改变调用起的函数并不需要重新编译。这在编程时十分有用。至于其他妙处，各位在电脑杂志、书籍中都能看到，我这里再说就是废话了.这次小弟我所要讲的是如何在VC5.0中如何做自己的Win32 DLLs，各位要做自己的动态连接库，首先要知道DLL在VC5.0中都有哪几种分类。VC支持三种DLL，它们是:<br>1.Non-MFC Dlls<br>2.Regular Dlls<br>3.Extension Dlls Note:翻译措辞不当，故遇到术语是引用原词<br><br>Non-MFC DLL:指的是不用MFC的类库结构，直接用C语言写的DLL，其输出的函数一般用的是标准C接口，并能被非MFC或MFC编写的应用程序所调用。LL，Regular DLL:和下述的Extension Dlls一样，是用MFC类库编写的。明显的特点是在源文件里有一个继承CWinApp的类。其又可细分成静态连接到MFC和动态连接到MFC上的。但静态连接到MFC的动态连&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/07/04/55361.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/55361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-07-04 17:54 <a href="http://www.cppblog.com/Lee7/archive/2008/07/04/55361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC之DLL编程</title><link>http://www.cppblog.com/Lee7/archive/2008/06/20/54127.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Fri, 20 Jun 2008 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/06/20/54127.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/54127.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/06/20/54127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/54127.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/54127.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 静态链接：每个应用程序使用函数库，必须拥有一份库的备份。多个应用程序运行时，内存中就有多份函数库代码的备份。<br><br>动态连接库：多个应用程序可以共享一份函数库的备份。<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/06/20/54127.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/54127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-06-20 14:07 <a href="http://www.cppblog.com/Lee7/archive/2008/06/20/54127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CFileFind类的使用总结[转]</title><link>http://www.cppblog.com/Lee7/archive/2008/05/27/51295.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Tue, 27 May 2008 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/05/27/51295.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/51295.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/05/27/51295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/51295.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/51295.html</trackback:ping><description><![CDATA[<div align=center><strong><font size=6>CFileFind类的使用总结</font></strong></div>
<div align=center><span style="FONT-SIZE: 14pt">2007-7-7</span></div>
<div><span style="FONT-SIZE: 14pt">1</span><span style="FONT-SIZE: 14pt">、</span><span style="FONT-SIZE: 14pt">CFileFind</span><span style="FONT-SIZE: 14pt">类的声明文件保存在</span><span style="FONT-SIZE: 14pt">afx.h</span><span style="FONT-SIZE: 14pt">头文件中。</span></div>
<div><span style="FONT-SIZE: 14pt">2</span><span style="FONT-SIZE: 14pt">、该类的实现的功能：执行本地文件的查找</span><span style="FONT-SIZE: 14pt">(</span><span style="FONT-SIZE: 14pt">查找某个具体的文件，查找某类文件</span><span style="FONT-SIZE: 14pt">x*.x*</span><span style="FONT-SIZE: 14pt">，查找所有文件</span><span style="FONT-SIZE: 14pt">*.*)</span></div>
<div><span style="FONT-SIZE: 14pt">3</span><span style="FONT-SIZE: 14pt">、</span><span style="FONT-SIZE: 14pt">CFileFind</span><span style="FONT-SIZE: 14pt">类是</span><span style="FONT-SIZE: 14pt">CGopherFileFind</span><span style="FONT-SIZE: 14pt">和</span><span style="FONT-SIZE: 14pt">CFtpFileFind</span><span style="FONT-SIZE: 14pt">类的基类。</span></div>
<div><span style="FONT-SIZE: 14pt">4</span><span style="FONT-SIZE: 14pt">、</span><span style="FONT-SIZE: 14pt">CFileFind</span><span style="FONT-SIZE: 14pt">类的构造函数</span><span style="FONT-SIZE: 14pt">::CFileFind()</span><span style="FONT-SIZE: 14pt">和关闭函数</span><span style="FONT-SIZE: 14pt">::Close()</span><span style="FONT-SIZE: 14pt">我会成对使用。</span></div>
<div><span style="FONT-SIZE: 14pt">5</span><span style="FONT-SIZE: 14pt">、</span><span style="FONT-SIZE: 14pt">CFileFind</span><span style="FONT-SIZE: 14pt">类的成员函数我根据其操作特性划分为３类：查找操作类、获得文件属性类、判断文件属性类。</span><span style="FONT-SIZE: 14pt">(</span><span style="FONT-SIZE: 14pt">下面我先进行函数罗列并没有完整的描述函数的参数</span><span style="FONT-SIZE: 14pt">)</span></div>
<div><span style="FONT-SIZE: 14pt">查找操作类</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::FindFile();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::FindNextFile();</span></div>
<div><span style="FONT-SIZE: 14pt">获得文件属性类</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::GetCreationTime();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::GetLastAccessTime();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::GetLastWriteTime();</span></div>
<div style="TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt">::GetFileName();</span></div>
<div style="TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt">::GetRoot();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::GetFilePath();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::GetFileTitle();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::GetFileURL();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::GetLength();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div><span style="FONT-SIZE: 14pt">判断文件属性类</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::IsArchived();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::IsCompressed();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::IsDirectory();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::IsDots();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::IsHidden();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::IsNormal();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::IsReadOnly();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::IsSystem();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::IsTemporary();</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::MatchesMask();</span></div>
<div><span style="FONT-SIZE: 14pt">6</span><span style="FONT-SIZE: 14pt">、</span><span style="FONT-SIZE: 14pt">CFileFind</span><span style="FONT-SIZE: 14pt">类中成员函数使用应注意的顺序</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 14pt">在创建了</span><span style="FONT-SIZE: 14pt">CFileFind</span><span style="FONT-SIZE: 14pt">对象后，先执行</span><span style="FONT-SIZE: 14pt">::FindFile()</span><span style="FONT-SIZE: 14pt">函数，然后执行</span><span style="FONT-SIZE: 14pt">::FindNextFile()</span><span style="FONT-SIZE: 14pt">，然后选择执行（获得文件属性类）的函数或者（判断文件属性类）函数。</span></div>
<div><span style="FONT-SIZE: 14pt">7</span><span style="FONT-SIZE: 14pt">、</span><span style="FONT-SIZE: 14pt">CFileFind</span><span style="FONT-SIZE: 14pt">类成员函数的详细分析</span></div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual BOOL FindFile(LPCTSTR pstrName = null,DWORD dwUnused = 0);</span></div>
<div><span style="FONT-SIZE: 14pt">该函数若返回</span><span style="FONT-SIZE: 14pt">非</span><span style="FONT-SIZE: 14pt">0 </span><span style="FONT-SIZE: 14pt">则表明执行成功，</span><span style="FONT-SIZE: 14pt">0 </span><span style="FONT-SIZE: 14pt">则表明执行不成功。</span></div>
<div><span style="FONT-SIZE: 14pt">pstrName</span><span style="FONT-SIZE: 14pt">：需要查找的文件名，例：&#8220;</span><span style="FONT-SIZE: 14pt">E:\\</span><span style="FONT-SIZE: 14pt">编程工具</span><span style="FONT-SIZE: 14pt">\\VC++\\MFC</span><span style="FONT-SIZE: 14pt">例子</span><span style="FONT-SIZE: 14pt">.rar</span><span style="FONT-SIZE: 14pt">&#8221;，&#8220;</span><span style="FONT-SIZE: 14pt">E:\\</span><span style="FONT-SIZE: 14pt">编程工具</span><span style="FONT-SIZE: 14pt">\\VC++\\MFC*.rar</span><span style="FONT-SIZE: 14pt">&#8221;，&#8220;</span><span style="FONT-SIZE: 14pt">E:\\</span><span style="FONT-SIZE: 14pt">编程工具</span><span style="FONT-SIZE: 14pt">\\VC++\\*.*</span><span style="FONT-SIZE: 14pt">&#8221;，也可以是</span><span style="FONT-SIZE: 14pt">NULL</span><span style="FONT-SIZE: 14pt">表示&#8220;</span><span style="FONT-SIZE: 14pt">*.*</span><span style="FONT-SIZE: 14pt">&#8221;。</span></div>
<div><span style="FONT-SIZE: 14pt">dwUnused</span><span style="FONT-SIZE: 14pt">：必须为</span><span style="FONT-SIZE: 14pt">0</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual BOOL FindNextFile();</span></div>
<div><span style="FONT-SIZE: 14pt">该函数返回值</span><span style="FONT-SIZE: 14pt">非</span><span style="FONT-SIZE: 14pt">0 </span><span style="FONT-SIZE: 14pt">还有符合条件的文件</span><span style="FONT-SIZE: 14pt">，</span><span style="FONT-SIZE: 14pt"> 0</span><span style="FONT-SIZE: 14pt">表示是最后一个文件。</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual BOOL GetCreationTime(FILETIME *pFileTime) const;</span></div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual BOOL GetCreationTime(CTime&amp;&nbsp;refTime) const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来获得查找到的某个文件的创建时间，返回值</span><span style="FONT-SIZE: 14pt">非</span><span style="FONT-SIZE: 14pt">0 </span><span style="FONT-SIZE: 14pt">获得创建时间成功操作，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示执行获得创建时间失败或者</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">没有被执行的时候。</span></div>
<div><span style="FONT-SIZE: 14pt">FILETIME &nbsp;*</span><span style="FONT-SIZE: 14pt">：容纳时间的结构指针</span></div>
<div><span style="FONT-SIZE: 14pt">CTime&amp;</span><span style="FONT-SIZE: 14pt">：容纳时间的对象地址</span></div>
<div><span style="FONT-SIZE: 14pt">此处介绍：</span><span style="FONT-SIZE: 14pt">FILETIME</span><span style="FONT-SIZE: 14pt">和</span><span style="FONT-SIZE: 14pt">CTime</span><span style="FONT-SIZE: 14pt">相互转换的处理方法：</span></div>
<div><span style="FONT-SIZE: 14pt">FILETIME</span><span style="FONT-SIZE: 14pt">转</span><span style="FONT-SIZE: 14pt">CTime</span><span style="FONT-SIZE: 14pt">的方法：</span></div>
<div><span style="FONT-SIZE: 14pt">A</span><span style="FONT-SIZE: 14pt">、</span><span style="FONT-SIZE: 14pt">CTime</span><span style="FONT-SIZE: 14pt">对象在初始化时可以传递</span><span style="FONT-SIZE: 14pt">FILETIME</span><span style="FONT-SIZE: 14pt">结构</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILETIME ft</span><span style="FONT-SIZE: 14pt">；</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CTime&nbsp;time(ft)</span><span style="FONT-SIZE: 14pt">；</span></div>
<div><span style="FONT-SIZE: 14pt">B</span><span style="FONT-SIZE: 14pt">、将</span><span style="FONT-SIZE: 14pt">FILETIME</span><span style="FONT-SIZE: 14pt">转换为</span><span style="FONT-SIZE: 14pt">SYSTEMTIME</span><span style="FONT-SIZE: 14pt">，然后</span><span style="FONT-SIZE: 14pt">CTime</span><span style="FONT-SIZE: 14pt">对象在初始化时可以传递</span><span style="FONT-SIZE: 14pt">SYSTEMTIME</span><span style="FONT-SIZE: 14pt">结构</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILETIME ft</span><span style="FONT-SIZE: 14pt">；</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYSTEMTIME st</span><span style="FONT-SIZE: 14pt">；</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL&nbsp;bSuccess </span><span style="FONT-SIZE: 14pt">＝</span><span style="FONT-SIZE: 14pt"> ::FileTimeToSystemTime(&amp;ft , &amp;st);</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CTime&nbsp;time(st)</span><span style="FONT-SIZE: 14pt">；</span></div>
<div><span style="FONT-SIZE: 14pt">CTime</span><span style="FONT-SIZE: 14pt">转</span><span style="FONT-SIZE: 14pt">FILETIME</span><span style="FONT-SIZE: 14pt">方法：</span></div>
<div><span style="FONT-SIZE: 14pt">CTime time(CTime::GetCurrentTime());</span></div>
<div><span style="FONT-SIZE: 14pt">SYSTEMTIME st;</span></div>
<div><span style="FONT-SIZE: 14pt">time.GetAsSystemTime(st);</span></div>
<div><span style="FONT-SIZE: 14pt">FILETIME ft;</span></div>
<div><span style="FONT-SIZE: 14pt">::SystemTimeToFileTime(&amp;st,&amp;ft);</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual BOOL GetLastAccessTime(FILETIME *pFileTime) const;</span></div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual BOOL GetLastAccessTime(CTime&amp; refTime) const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来获得某个文件最后被访问的时间，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示执行成功，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示执行失败或者</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">函数没有执行的时候。</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual BOOL GetLastWriteTime(FILETIME *pFileTime) const;</span></div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual BOOL GetLastWriteTime(CTime&amp; refTime) const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来获得某个文件最后被访问的时间，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示执行成功，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示执行失败或者</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">函数没有执行的时候。</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual CString GetFilePath() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来获得查找到的文件绝对路径，必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功。</span></div>
<div><span style="FONT-SIZE: 14pt">返回的结果是</span><span style="FONT-SIZE: 14pt">CString</span><span style="FONT-SIZE: 14pt">对象，例&#8220;</span><span style="FONT-SIZE: 14pt">E:\\</span><span style="FONT-SIZE: 14pt">编程工具</span><span style="FONT-SIZE: 14pt">\\VC++\\MFC.rar</span><span style="FONT-SIZE: 14pt">&#8221;</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual CString GetFileName() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来获得查找到的文件的全称，必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功。</span></div>
<div><span style="FONT-SIZE: 14pt">返回的结果是</span><span style="FONT-SIZE: 14pt">CString</span><span style="FONT-SIZE: 14pt">对象，例&#8220;</span><span style="FONT-SIZE: 14pt">MFC.rar</span><span style="FONT-SIZE: 14pt">&#8221;</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual CString GetFileTitle() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来获得查找到的文件的名称，必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功。</span></div>
<div><span style="FONT-SIZE: 14pt">返回的结果是</span><span style="FONT-SIZE: 14pt">CString</span><span style="FONT-SIZE: 14pt">对象，例&#8220;</span><span style="FONT-SIZE: 14pt">MFC</span><span style="FONT-SIZE: 14pt">&#8221;</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual CString GetRoot() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来获得查找到的文件的根目录，必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功。</span></div>
<div><span style="FONT-SIZE: 14pt">返回的结果是</span><span style="FONT-SIZE: 14pt">CString</span><span style="FONT-SIZE: 14pt">对象，例&#8220;</span><span style="FONT-SIZE: 14pt">E:\\</span><span style="FONT-SIZE: 14pt">编程工具</span><span style="FONT-SIZE: 14pt">\\VC++\\</span><span style="FONT-SIZE: 14pt">&#8221;</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">virtual CString GetFileURL() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来获得查找到的文件的</span><span style="FONT-SIZE: 14pt">URL</span><span style="FONT-SIZE: 14pt">路径，必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功。</span></div>
<div><span style="FONT-SIZE: 14pt">返回的结果是</span><span style="FONT-SIZE: 14pt">CString</span><span style="FONT-SIZE: 14pt">对象，例&#8220;</span><span style="FONT-SIZE: 14pt">file://E:\\</span><span style="FONT-SIZE: 14pt">编程工具</span><span style="FONT-SIZE: 14pt">\\VC++\\MFC.rar</span><span style="FONT-SIZE: 14pt">&#8221;</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">DWORD GetLength() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数返回值获得查找到的文件的长度，必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功。</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">BOOL IsArchived() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件属性是否是档案文件，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">BOOL &nbsp;IsCompressed() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件属性是否是压缩文件，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">BOOL IsDirectory() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件属性是否是路径文件，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">BOOL IsDots() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件属性是否是&#8220;</span><span style="FONT-SIZE: 14pt">.</span><span style="FONT-SIZE: 14pt">&#8221;，&#8220;</span><span style="FONT-SIZE: 14pt">..</span><span style="FONT-SIZE: 14pt">&#8221;，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">BOOL&nbsp;IsHidden() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件属性是否隐藏文件，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">BOOL IsNormal() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件属性是否正常文件，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">BOOL&nbsp;IsReadOnly() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件属性是否只读文件，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">BOOL&nbsp;IsSystem() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件属性是否系统文件，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 12pt; COLOR: red">BOOL&nbsp;IsTemporary() const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件属性是否临时文件，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 14pt">BOOL&nbsp;MatchesMask(DWORD dwMask) const;</span></div>
<div><span style="FONT-SIZE: 14pt">该函数用来判断查找的文件的综合属性，非</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示是，</span><span style="FONT-SIZE: 14pt">0</span><span style="FONT-SIZE: 14pt">表示不是。必须在执行了</span><span style="FONT-SIZE: 14pt">FindNextFile()</span><span style="FONT-SIZE: 14pt">后该函数才能执行成功</span></div>
<div><span style="FONT-SIZE: 14pt">dwMask</span><span style="FONT-SIZE: 14pt">参数的使用方法：几种文件属性采用或运算（</span><span style="FONT-SIZE: 14pt">|</span><span style="FONT-SIZE: 14pt">）</span></div>
<div><span style="FONT-SIZE: 14pt">文件属性的结构定义：</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_ARCHIVE</span><span style="FONT-SIZE: 14pt">：档案文件</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_COMPRESSED</span><span style="FONT-SIZE: 14pt">：压缩文件</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_DIRECTORY</span><span style="FONT-SIZE: 14pt">：路径文件</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_NORMAL</span><span style="FONT-SIZE: 14pt">：正常文件</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_READONLY</span><span style="FONT-SIZE: 14pt">：只读文件</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_SYSTEM</span><span style="FONT-SIZE: 14pt">：系统文件</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_TEMPORARY</span><span style="FONT-SIZE: 14pt">：临时文件</span></div>
<div><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_ATTRIBUTE_HIDDEN</span><span style="FONT-SIZE: 14pt">：隐藏文件</span></div>
<div>&nbsp;</div>
<img src ="http://www.cppblog.com/Lee7/aggbug/51295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-05-27 17:05 <a href="http://www.cppblog.com/Lee7/archive/2008/05/27/51295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你会用sizeof吗？（vc篇）</title><link>http://www.cppblog.com/Lee7/archive/2008/05/25/51077.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Sun, 25 May 2008 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/05/25/51077.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/51077.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/05/25/51077.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/51077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/51077.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="85%" align=center border=0>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 18px" align=middle width="100%" height=80>
            <p><font color=#000066><strong>你会用sizeof吗？（vc篇）</strong></font></p>
            </td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 9pt" align=middle width="100%" height=20><font color=#666666></font></td>
        </tr>
        <tr>
            <td style="FONT-SIZE: 14px" align=middle width="100%">
            <table cellSpacing=0 cellPadding=0 align=center border=0>
                <tbody>
                    <tr>
                        <td height=25>&nbsp; </td>
                    </tr>
                    <tr>
                        <td style="FONT-SIZE: 14px">本文主要包括二个部分，第一部分重点介绍在VC中，怎么样采用sizeof来求结构的大小，以及容易出现的问题，并给出解决问题的方法，第二部分总结出VC中sizeof的主要用法。<br><br>1、 sizeof应用在结构上的情况<br><br>请看下面的结构：<br><br>struct MyStruct<br><br>{<br><br>double dda1;<br><br>char dda;<br><br>int type<br><br>};<br><br>对结构MyStruct采用sizeof会出现什么结果呢？sizeof(MyStruct)为多少呢？也许你会这样求：<br><br>sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13<br><br>但是当在VC中测试上面结构的大小时，你会发现sizeof(MyStruct)为16。你知道为什么在VC中会得出这样一个结果吗？<br><br>其实，这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度，VC对一些变量的起始地址做了&#8220;对齐&#8221;处理。在默认情况下，VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。<br><br>类型<br>对齐方式（变量存放的起始地址相对于结构的起始地址的偏移量）<br><br>Char<br>偏移量必须为sizeof(char)即1的倍数<br><br>int<br>偏移量必须为sizeof(int)即4的倍数<br><br>float<br>偏移量必须为sizeof(float)即4的倍数<br><br>double<br>偏移量必须为sizeof(double)即8的倍数<br><br>Short<br>偏移量必须为sizeof(short)即2的倍数<br><br><br><br>各成员变量在存放的时候根据在结构中出现的顺序依次申请空间，同时按照上面的对齐方式调整位置，空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数（即该结构中占用最大空间的类型所占用的字节数）的倍数，所以在为最后一个成员变量申请空间后，还会根据需要自动填充空缺的字节。<br><br>下面用前面的例子来说明VC到底怎么样来存放结构的。<br><br>struct MyStruct <br><br>{<br><br>double dda1; <br><br>char dda;<br><br>int type<br><br>}；<br><br>为上面的结构分配空间的时候，VC根据成员变量出现的顺序和对齐方式，先为第一个成员dda1分配空间，其起始地址跟结构的起始地址相同（刚好偏移量0刚好为sizeof(double)的倍数），该成员变量占用sizeof(double)=8个字节；接下来为第二个成员dda分配空间，这时下一个可以分配的地址对于结构的起始地址的偏移量为8，是sizeof(char)的倍数，所以把dda存放在偏移量为8的地方满足对齐方式，该成员变量占用sizeof(char)=1个字节；接下来为第三个成员type分配空间，这时下一个可以分配的地址对于结构的起始地址的偏移量为9，不是sizeof(int)=4的倍数，为了满足对齐方式对偏移量的约束问题，VC自动填充3个字节（这三个字节没有放什么东西），这时下一个可以分配的地址对于结构的起始地址的偏移量为12，刚好是sizeof(int)=4的倍数，所以把type存放在偏移量为12的地方，该成员变量占用sizeof(int)=4个字节；这时整个结构的成员变量已经都分配了空间，总的占用的空间大小为：8+1+3+4=16，刚好为结构的字节边界数（即结构中占用最大空间的类型所占用的字节数sizeof(double)=8）的倍数，所以没有空缺的字节需要填充。所以整个结构的大小为：sizeof(MyStruct)=8+1+3+4=16，其中有3个字节是VC自动填充的，没有放任何有意义的东西。<br><br>下面再举个例子，交换一下上面的MyStruct的成员变量的位置，使它变成下面的情况：<br><br>struct MyStruct <br><br>{<br><br>char dda;<br><br>double dda1; <br><br>int type<br><br>}；<br><br>这个结构占用的空间为多大呢？在VC6.0环境下，可以得到sizeof(MyStruc)为24。结合上面提到的分配空间的一些原则，分析下VC怎么样为上面的结构分配空间的。（简单说明）<br><br>struct MyStruct <br><br>{<br><br>char dda;//偏移量为0，满足对齐方式，dda占用1个字节；<br><br>double dda1;//下一个可用的地址的偏移量为1，不是sizeof(double)=8<br><br>//的倍数，需要补足7个字节才能使偏移量变为8（满足对齐<br><br>//方式），因此VC自动填充7个字节，dda1存放在偏移量为8<br><br>//的地址上，它占用8个字节。<br><br>int type；//下一个可用的地址的偏移量为16，是sizeof(int)=4的倍<br><br>//数，满足int的对齐方式，所以不需要VC自动填充，type存<br><br>//放在偏移量为16的地址上，它占用4个字节。<br><br>}；//所有成员变量都分配了空间，空间总的大小为1+7+8+4=20，不是结构<br><br>//的节边界数（即结构中占用最大空间的类型所占用的字节数sizeof<br><br>//(double)=8）的倍数，所以需要填充4个字节，以满足结构的大小为<br><br>//sizeof(double)=8的倍数。<br><br><br><br>所以该结构总的大小为：sizeof(MyStruc)为1+7+8+4+4=24。其中总的有7+4=11个字节是VC自动填充的，没有放任何有意义的东西。<br><br><br><br>VC对结构的存储的特殊处理确实提高CPU存储变量的速度，但是有时候也带来了一些麻烦，我们也屏蔽掉变量默认的对齐方式，自己可以设定变量的对齐方式。<br><br>VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况：第一、如果n大于等于该变量所占用的字节数，那么偏移量必须满足默认的对齐方式，第二、如果n小于该变量的类型所占用的字节数，那么偏移量为n的倍数，不用满足默认的对齐方式。结构的总大小也有个约束条件，分下面两种情况：如果n大于所有成员变量类型所占用的字节数，那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数；<br><br>否则必须为n的倍数。下面举例说明其用法。<br><br>#pragma pack(push) //保存对齐状态<br><br>#pragma pack(4)//设定为4字节对齐<br><br>struct test<br><br>{<br><br>char m1;<br><br>double m4;<br><br>int m3;<br><br>};<br><br>#pragma pack(pop)//恢复对齐状态<br><br>以上结构的大小为16，下面分析其存储情况，首先为m1分配空间，其偏移量为0，满足我们自己设定的对齐方式（4字节对齐），m1占用1个字节。接着开始为m4分配空间，这时其偏移量为1，需要补足3个字节，这样使偏移量满足为n=4的倍数（因为sizeof(double)大于n）,m4占用8个字节。接着为m3分配空间，这时其偏移量为12，满足为4的倍数，m3占用4个字节。这时已经为所有成员变量分配了空间，共分配了16个字节，满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(16)，那么我们可以得到结构的大小为24。（请读者自己分析）<br><br>2、 sizeof用法总结<br><br>在VC中，sizeof有着许多的用法，而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个总结。<br><br>A． 参数为数据类型或者为一般变量。例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节，在32位系统中占4个字节。<br><br>B． 参数为数组或指针。下面举例说明.<br><br>int a[50]; //sizeof(a)=4*50=200; 求数组所占的空间大小<br><br>int *a=new int[50];// sizeof(a)=4; a为一个指针，sizeof(a)是求指针<br><br>//的大小,在32位系统中，当然是占4个字节。<br><br>C． 参数为结构或类。Sizeof应用在类和结构的处理情况是相同的。但有两点需要注意，第一、结构或者类中的静态成员不对结构或者类的大小产生影响，因为静态变量的存储位置与结构或者类的实例地址无关。<br><br>第二、没有成员变量的结构或类的大小为1，因为必须保证结构或类的每一<br><br>个实例在内存中都有唯一的地址。<br><br>下面举例说明，<br><br>Class Test{int a;static double c};//sizeof(Test)=4.<br><br>Test *s;//sizeof(s)=4,s为一个指针。<br><br>Class test1{ };//sizeof(test1)=1;<br><br>D． 参数为其他。下面举例说明。<br><br>int func(char s[5]);<br><br>{<br><br>cout&lt;<sizeof(s); 这里将输出4，本来s为一个数组，但由于做为函<br><br>//数的参数在传递的时候系统处理为一个指针，所<br><br>//以sizeof(s)实际上为求指针的大小。<br><br>return 1;<br><br>}<br><br>sizeof(func(&#8220;1234&#8221;))=4//因为func的返回类型为int，所以相当于<br><br>//求sizeof(int).<br><br><br><br>以上为sizeof的基本用法，在实际的使用中要注意分析VC的分配变量的分配策略，这样的话可以避免一些错误。</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/Lee7/aggbug/51077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-05-25 21:55 <a href="http://www.cppblog.com/Lee7/archive/2008/05/25/51077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的尺寸[转]</title><link>http://www.cppblog.com/Lee7/archive/2008/05/25/51076.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Sun, 25 May 2008 13:53:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/05/25/51076.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/51076.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/05/25/51076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/51076.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/51076.html</trackback:ping><description><![CDATA[<h3>转自：<a href="http://blog.csdn.net/arong1234/archive/2008/03/23/2210462.aspx">http://blog.csdn.net/arong1234/archive/2008/03/23/2210462.aspx</a></h3>
<h3>1. sizeof:返回类型的尺寸</h3>
<p>&nbsp;每个类型在编译时都会决定自己的实例需要多少字节。在编译后，该类型的所有对象占有的空间是一样的，不会发生变化。因此，我们可以用sizeof来计算一个类型或者该类型的某个实例来得到尺寸信息。下面的代码是等价的</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 104px">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">sizeof&nbsp;type</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>//sizeof instance<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(iVal)<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<p>无论我们用iVal还是int，上面的表达式都会返回int类型的尺寸（当然如前所说，iVal的尺寸和其类型尺寸永远是一样的)。</p>
<p>不熟悉sizeof的朋友往往会在处理指针时弄错概念。考虑下面代码：</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iArray[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">];<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sizeofArray</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(iArray);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">];<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sizeofPointer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(p);</span></div>
</div>
<p>在很多人心目中，指针和数组是等价的，但是事实严格起来并不如此。上面的代码就会返回不同的结果。</p>
<p>对于iArray，它的类型是int[10]，是一个数组，sizeof计算其尺寸时，知道它包含10个元素，每个元素都时个整型，因此返回40。而对于p，它的类型是int*，指针的尺寸永远是4，因此结果就是4。sizeof不会也不可能知道p实际指向10个元素的数组。</p>
<p>出现这个问题的原因有两个：1. sizeof是在编译时计算的，而new int[10]指向的数组是在运行时创建的，也就是说当sizeof(p)计算时，系统还不知道p会指向多少个int元素，自然也不可能知道它指向的数组占有多少字节。2. sizeof计算的是p自己的类型所占据的空间，而不是p指向的对象所占据的空间，可以说，p自己占据4个字节，而p指向的空间占40字节。</p>
<p>在这种概念下，我们是不是可以通过sizeof(*p)来得到40呢？很不幸，不行，原因是p的类型是int*，*p的类型是int，因此无法得到其是一个数组的事实。</p>
<p>实际上，这个尺寸信息是个运行时数据，作为C/C++语言而言，是无从知道这个信息的（因为C/C++指针不包含这种信息），要得到它，唯一的办法是指望操作系统在运行时中提供。在VC中，我们可以通过_msize得到。</p>
<p>2. 对齐问题</p>
<p>我们在访问内存时，如果地址是按4字节对齐，则访问效率会高很多。这个问题的原因在于访问内存的硬件电路。一般情况下，地址总线总是按照对齐后的地址来访问。例如你想得到0x00000001开始的4字节内容，系统首先需要以0x00000000读4字节，然后从中取得3字节，然后在用0x00000004作为开始地址，获得下一个四字节，在从中得到第一个字节，两次组合出你想得到的内容。但是如果地址一开始就是对齐到0x00000000，则系统只要一次读写即可。</p>
<p>为了性能考虑，编译器会对结构进行对齐处理。考虑下面的结构</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;aStruct<br><img id=_15_75_Open_Image onclick="this.style.display='none'; document.getElementById('_15_75_Open_Text').style.display='none'; document.getElementById('_15_75_Closed_Image').style.display='inline'; document.getElementById('_15_75_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_15_75_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_15_75_Closed_Text').style.display='none'; document.getElementById('_15_75_Open_Image').style.display='inline'; document.getElementById('_15_75_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_15_75_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_15_75_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cValue;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;iValue;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
</div>
<p>&nbsp;</p>
<p>直观的讲，这个结构的尺寸是sizeof(char)+sizeof(int)＝5,但是在实际编译下，这个结构尺寸缺省是8，因为第二个域ivalue会被对齐到第四个字节。</p>
<p>在VC中，我们可以用pack预处理指令来禁止对齐调整。例如,下面代码将使得结构尺寸更加紧凑，不会出现对齐到4字节问题：</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">#pragma</span><span style="COLOR: #000000">&nbsp;pack(1)</span><span style="COLOR: #000000"><br><img id=_30_70_Open_Image onclick="this.style.display='none'; document.getElementById('_30_70_Open_Text').style.display='none'; document.getElementById('_30_70_Closed_Image').style.display='inline'; document.getElementById('_30_70_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_30_70_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_30_70_Closed_Text').style.display='none'; document.getElementById('_30_70_Open_Image').style.display='inline'; document.getElementById('_30_70_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;aStruct</span><span id=_30_70_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_30_70_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cValue;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iValue;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">#pragma</span><span style="COLOR: #000000">&nbsp;pack()</span></div>
</div>
<p>对于这个pack指令的含义，大家可以查询MSDN。请注意：除非你觉得必须这样，不要轻易做这样的调整，因为这将降低程序性能。目前比较常见的用法是：1. 这个结构需要被直接写入文件 2. 这个结构需要通过网络传给其他程序。</p>
<p>注意：字节对齐是编译时决定的，一旦决定不会再改变，因此即使有对齐的因素在，也不会出现一个结构在运行时尺寸发生变化的情况出现。</p>
<img src ="http://www.cppblog.com/Lee7/aggbug/51076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-05-25 21:53 <a href="http://www.cppblog.com/Lee7/archive/2008/05/25/51076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用rand()和srand()产生为随机数的方法总结[转]</title><link>http://www.cppblog.com/Lee7/archive/2008/05/22/50737.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Thu, 22 May 2008 03:23:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/05/22/50737.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/50737.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/05/22/50737.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/50737.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/50737.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 标准库<cstdlib>（被包含于<iostream>中）提供两个帮助生成伪随机数的函数： &nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/05/22/50737.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/50737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-05-22 11:23 <a href="http://www.cppblog.com/Lee7/archive/2008/05/22/50737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP/IP 数据包头格式 （转）</title><link>http://www.cppblog.com/Lee7/archive/2008/05/16/50043.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Fri, 16 May 2008 06:50:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/05/16/50043.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/50043.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/05/16/50043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/50043.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/50043.html</trackback:ping><description><![CDATA[最近狂补基础，猛看TCP/IP协议。不过，书上的东西太抽象了，没有什么数据实例，看了不 久就忘了。于是，搬来一个sniffer，抓了数据包来看，呵呵，结合书里面得讲解，理解得 比较快。我就来灌点基础知识。　
<p>　　<strong>开始吧，先介绍IP协议。　 </strong></p>
<p>　　IP协议（Internet Protocol）是网络层协议，用在因特网上，TCP，UDP，ICMP，IGMP数据都是按照IP数据格式发送得。IP协议提供的是不可靠无连接得服务。IP数据包由一个头部和一个正文部分构成。正文主要是传输的数据，我们主要来理解头部数据，可以从其理解到IP协议。　 </p>
<p>　　<strong>IP数据包头部格式（RFC791）</strong></p>
<p align=center><img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" src="http://industry.ccidnet.com/col/attachment/2007/2/1013357.jpg"><span id=ad_qqread_mid_big></span></p>
<p>　　<strong>Example Internet Datagram Header</strong>　</p>
<p>　　上面的就是IP数据的头部格式，这里大概地介绍一下。　 </p>
<p>　　IP头部由20字节的固定长度和一个可选任意长度部分构成，以大段点机次序传送，从左到 右。　 </p>
<p>　　<strong>TCP协议</strong>　 </p>
<p>　　TCP协议（TRANSMISSION CONTROL PROTOCOL）是传输层协议，为应用层提供服务，和UDP不同的是，TCP协议提供的可靠的面向连接的服务。在RFC793中是基本的TCP描述。关于TCP协议的头部格式内容的说明：　 </p>
<p>　　<strong>TCP Header FORMat　</strong></p>
<p>　</p>
<p align=center><img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" src="http://industry.ccidnet.com/col/attachment/2007/2/1013359.jpg"></p>
<p>　　<strong>TCP Header FORMat　 </strong></p>
<p>　　跟IP头部差不多，基本的长度也是20字节。TCP数据包是包含在一个IP数据报文中的。　 </p>
<p>　　好了，简单介绍到此为止。来看看我捕获的例子吧。这是一次FTP的连接，呵呵，是cuteftp默认的cuteftp的FTP站点，IP地址是：216.3.226.21。我的IP地址假设为:192.168.1.1。下面的数据就是TCO/IP连接过程中的数据传输。我们可以分析TCP/IP协议数据格式以及TCP/IP连接的三次握手（ThreeWay-Handshake）情况。下面的这些十六进制数据只是TCP/IP协议的数据，不是完整的网络通讯数据。　 </p>
<p>　　第一次，我向FTP站点发送连接请求（我把TCP数据的可选部分去掉了）　</p>
<p>　　192.168.1.1-&gt;216.3.226.21　 <br><br>　　IP头部： 45 00 00 30 52 52 40 00 80 06 2c 23 c0 a8 01 01 d8 03 e2 15　 <br><br>　　TCP头部：0d 28 00 15 50 5f a9 06 00 00 00 00 70 02 40 00 c0 29 00 00　 </p>
<p>　　来看看IP头部的数据是些什么。　 </p>
<p>　　第一字节，&#8220;45&#8221;，其中&#8220;4&#8221;是IP协议的版本（Version），说明是IP4。&#8220;5&#8221;是IHL位，表示IP头部的长度，是一个4bit字段，最大就是1111了，值为12，IP头部的最大长度就是60字节。而这里为&#8220;5&#8221;，说明是20字节，这是标准的IP头部长度，头部报文中没有发送可选部分数据。　 </p>
<p>　　接下来的一个字节&#8220;00&#8221;是服务类型（Type of Service）。这个8bit字段由3bit的优先权子字段（现在已经被忽略），4 bit的TOS子字段以及1 bit的未用字段（现在为0）构成.4 bit的TOS子字段包含：最小延时、最大吞吐量、最高可靠性以及最小费用构成，这四个1bit位最多只能有一个为1，本例中都为0，表示是一般服务。　 </p>
<p>　　接着的两个字节&#8220;00 30&#8221;是IP数据报文总长，包含头部以及数据，这里表示48字节。这48字节由20字节的IP头部以及28字节的TCP头构成（本来截取的TCP头应该是28字节的，其中8字节为可选部分，被我省去了）。因此目前最大的IP数据包长度是65535字节。　 </p>
<p>　　再是两个字节的标志位（Identification）：&#8220;5252&#8221;，转换为十进制就是21074。这个是让目的主机来判断新来的分段属于哪个分组。　 </p>
<p>　　下一个字节&#8220;40&#8221;，转换为二进制就是&#8220;0100 0000&#8221;，其中第一位是IP协议目前没有用上的，为0。接着的是两个标志DF和MF。DF为1表示不要分段，MF为1表示还有进一步的分段（本例为0）。然后的&#8220;0 0000&#8221;是分段便移（Fragment Offset）。　 </p>
<p>　　&#8220;80&#8221;这个字节就是TTL（Time To Live）了，表示一个IP数据流的生命周期，用Ping显示的结果，能得到TTL的值，很多文章就说通过TTL位来判别主机类型。因为一般主机都有默认的TTL值，不同系统的默认值不一样。比如WINDOWS为128。不过，一般Ping得到的都不是默认值，这是因为每次IP数据包经过一个路由器的时候TTL就减一，当减到0时，这个数据包就消亡了。这也时Tracert的原理。本例中为&#8220;80&#8221;，转换为十进制就是128了，我用的WIN2000。　 </p>
<p>　　继续下来的是&#8220;06&#8221;，这个字节表示传输层的协议类型（Protocol）。在RFC790中有定义，6表示传输层是TCP协议。　 </p>
<p>　　&#8220;2c 23&#8221;这个16bit是头校验和（Header Checksum）。　 </p>
<p>　　接下来&#8220;c0 a8 01 01&#8221;，这个就是源地址（Source Address）了，也就是我的IP地址。 </p>
<p>　　转换为十进制的IP地址就是：192.168.1.1，同样，继续下来的32位&#8220;d8 03 e2 15&#8221;是目标地址，216.3.226.21　 </p>
<p>　　好了，真累啊，终于看完基本的20字节的IP数据报头了。继续看TCP的头部吧，这个是作为IP数据包的数据部分传输的。　 </p>
<p>　　TCP头部：0d 28 00 15 50 5f a9 06 00 00 00 00 70 02 40 00 c0 29 00 00　 </p>
<p>　　一来就是一个两字节段&#8220;0d 28&#8221;，表示本地端口号，转换为十进制就是3368。第二个两字节段&#8220;00 15&#8221;表示目标端口，因为我是连接FTP站点，所以，这个就是21啦，十六进制当然就是&#8220;00 15&#8221;。　 </p>
<p>　　接下来的四个字节&#8220;50 5f a9 06&#8221;是顺序号（Sequence Number），简写为SEQ，SEQ=1348446470下面的四个字节&#8220;00 00 00 00&#8221;是确认号（Acknowledgment Number），简写为ACKNUM。　 </p>
<p>　　继续两个字节，&#8220;70 02&#8221;，转换为二进制吧，&#8220;0111 0000 0000 0010&#8221;。这两个字节,总共16bit，有好多东西呢。第一个4bit&#8220;0111&#8221;，是TCP头长，十进制为7，表示28个字节（刚才说了，我省略了8字节的option数据，所以你只看见了20字节）。接着的6bit现在TCP协议没有用上，都为0。最后的6bit&#8220;00 0010&#8221;是六个重要的标志。这是两个计算机数据交流的信息标志。接收和发送断根据这些标志来确定信息流的种类。下面是一些介绍：　 </p>
<p>　　URG：（Urgent Pointer field significant）紧急指针。用到的时候值为1，用来处理避免TCP数据流中断　 </p>
<p>　　ACK：（Acknowledgment fieldsignificant）置1时表示确认号（AcknowledgmentNumber）为合法，为0的时候表示数据段不包含确认信息，确认号被忽略。　 </p>
<p>　　PSH：（Push Function），PUSH标志的数据，置1时请求的数据段在接收方得到后就可直接送到应用程序，而不必等到缓冲区满时才传送。　 </p>
<p>　　RST：（Reset the connection）用于复位因某种原因引起出现的错误连接，也用来拒绝非法数据和请求。如果接收到RST位时候，通常发生了某些错误。　 </p>
<p>　　SYN：（Synchronize sequence numbers）用来建立连接，在连接请求中，SYN=1，ACK=0，连接响应时，SYN=1，ACK=1。即，SYN和ACK来区分Connection Request和Connection Accepted。　 </p>
<p>　　FIN：（No more data from sender）用来释放连接，表明发送方已经没有数据发送了。　 </p>
<p>　　这6个标志位，你们自己对号入座吧。本例中SYN=1，ACK=0，当然就是表示连接请求了。我们可以注意下面两个过程的这两位的变换。　 </p>
<p>　　后面的&#8220;40 00 c0 29 00 00&#8221;不讲了，呵呵，偷懒了。后面两次通讯的数据，自己分开看吧。我们看看连接的过程，一些重要地方的变化。　 </p>
<p>　　第二次，FTP站点返回一个可以连接的信号。　 </p>
<p>　　216.3.226.21-&gt;192.168.1.1　 </p>
<p>　　IP头部： 45 00 00 2c c6 be 40 00 6a 06 cd ba d8 03 e2 15 c0 a8 01 01　 <br><br>　　TCP头部：00 15 0d 28 4b 4f 45 c1 50 5f a9 07 60 12 20 58 64 07 00 00　 </p>
<p>　　第三次，我确认连接。TCP连接建立起来。　 </p>
<p>　　192.168.1.1-&gt;216.3.226.21　 <br><br>　　IP头部： 45 00 00 28 52 53 40 00 80 06 2c 2a c0 a8 01 01 d8 03 e2 15　 <br><br>　　TCP头部：0d 28 00 15 50 5f a9 07 4b 4f 45 c2 50 10 40 b0 5b 1c 00 00　 </p>
<p>　　好，我们看看整个Threeway_handshake过程。　 <br><br>　　第一步，我发出连接请求，TCP数据为：SEQ=50 5f a9 06，ACKNUM=00 00 00 00，SYN=1，ACK=0。　 </p>
<p>　　第二步，对方确认可以连接，TCP数据为：SEQ=4b 4f 45 c1，ACKNUM=50 5f a9 07，SYN=1，ACK=1。　 </p>
<p>　　第三步，我确认建立连接。SEQ=50 5f a9 07， ACKNUM=4b 4f45c2，SYN=0，ACK=1。　 </p>
<p>　　可以看出什么变化么？正式建立连接了呢，这些东西是什么值？　 </p>
<p>　　我接收从216.3.226.21-&gt;192.168.1.1的下一个数据包中：　 </p>
<p>　　SEQ=4b 4f 45 c2，ACKNUM=50 5f a9 07,SYN=0,ACK=1这些都是很基础的东西，对于编写sniffer这样的东西是必须非常熟悉的。这里只讲解了TCP/IP协议的一点点东西，主要是头部数据的格式</p>
<img src ="http://www.cppblog.com/Lee7/aggbug/50043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-05-16 14:50 <a href="http://www.cppblog.com/Lee7/archive/2008/05/16/50043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的虚函数(virtual function)</title><link>http://www.cppblog.com/Lee7/archive/2008/04/27/48227.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Sat, 26 Apr 2008 17:15:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/04/27/48227.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/48227.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/04/27/48227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/48227.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/48227.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.简介 &nbsp;&nbsp;&nbsp;&nbsp;虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次：class&nbsp;A{public:&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;void&nbsp;foo()&nbsp;{&nbsp;cout&nbsp;&lt;&lt;&...&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/04/27/48227.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/48227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-04-27 01:15 <a href="http://www.cppblog.com/Lee7/archive/2008/04/27/48227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的static关键字</title><link>http://www.cppblog.com/Lee7/archive/2008/04/27/48224.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Sat, 26 Apr 2008 17:00:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/04/27/48224.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/48224.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/04/27/48224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/48224.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/48224.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 作者：韩耀旭　　C++的static有两种用法：面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数，不涉及类；后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前，加上关键字static，该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子，如下： //Example&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/04/27/48224.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/48224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-04-27 01:00 <a href="http://www.cppblog.com/Lee7/archive/2008/04/27/48224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc自定义消息的发送与接收的方法实现 </title><link>http://www.cppblog.com/Lee7/archive/2008/04/22/47845.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Tue, 22 Apr 2008 13:17:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/04/22/47845.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/47845.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/04/22/47845.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/47845.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/47845.html</trackback:ping><description><![CDATA[<div>
<p><span style="FONT-WEIGHT: bold">以下用一个自创的对话框类(MyMessageDlg)向视图类(MessageTestView)<br>发送自定义消息为例，说明这两种不同方法的自定义消息的</span></p>
<p><span style="COLOR: rgb(255,0,0)">消息传递的方法一：使用ON_MESSAGE<br></span>使用ON_MESSAGE响应消息，必须配合定义消息#define WM_MY_MESSAGE (WM_USER+100)</p>
<p>对于<span style="COLOR: rgb(0,0,255)">发送消息者</span>-MyMessageDlg，<br>在其MyMessageDlg.h中，定义#define WM_MY_MESSAGE (WM_USER+100)<br>在其MyMessageDlg.cpp中要先添加：＃i nclude "MainFrm.h"<br>因为使用了CMainFrame*定义对象。<br>并且要有测试消息的函数：<br>void MyMessageDlg::OnButtonMsg()<br>{<br>&nbsp;&nbsp;&nbsp; // TODO: Add your control notification handler code here<br>&nbsp;&nbsp;&nbsp; CMainFrame* pMF=(CMainFrame*)AfxGetApp()-&gt;m_pMainWnd;&nbsp; //先通过获取当前框架指针<br>&nbsp;&nbsp;&nbsp; CView * active = pMF-&gt;GetActiveView();//才能获取当前视类指针<br>&nbsp;&nbsp;&nbsp; if(active != NULL)&nbsp; //获取了当前视类指针才能发送消息<br>&nbsp;&nbsp;&nbsp; active-&gt;PostMessage(WM_MY_MESSAGE,0,0);&nbsp;&nbsp; //使用PostMessage发送消息<br>}</p>
<p>对于<span style="COLOR: rgb(51,0,255)">消息的接受者</span>-MessageTestView，<br>在其MessageTestView.h中，也要定义#define WM_MY_MESSAGE (WM_USER+100)<br>并定义消息映射函数-OnMyMessage()<br>protected:<br>&nbsp;//{{AFX_MSG(CMessageTestView)<br>&nbsp;afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);<br>&nbsp;//}}AFX_MSG<br>&nbsp;DECLARE_MESSAGE_MAP()<br>在其MessageTestView.cpp中，<br>先要声明响应消息：<br>BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)<br>&nbsp;//{{AFX_MSG_MAP(CMessageTestView)<br>&nbsp;ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)<br>&nbsp;//}}AFX_MSG_MAP<br>再添加消息响应的函数实现：<br>LRESULT CMessageTestView::OnMyMessage(WPARAM wParam, LPARAM lParam)<br>{<br>&nbsp;MessageBox("OnMyMessage!");<br>&nbsp;return 0;<br>}</p>
<p><br><span style="COLOR: rgb(255,0,0)">消息传递的方法二：使用ON_REGISTERED_MESSAGE<br></span>使用ON_REGISTERED_MESSAGE注册消息，必须配合<br>static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");</p>
<p>对于<span style="COLOR: rgb(213,43,111)">消息的发送者</span>-MyMessageDlg，<br>在其MyMessageDlg.h中，只要<br>定义static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");<br>就可以了。<br>在其MyMessageDlg.cpp中要先添加：＃i nclude "MainFrm.h"<br>因为使用了CMainFrame*定义对象。<br>并且要有测试消息的函数：<br>void MyMessageDlg::OnButtonMsg()<br>{<br>&nbsp;&nbsp;&nbsp; // TODO: Add your control notification handler code here<br>&nbsp;&nbsp;&nbsp; CMainFrame* pMF=(CMainFrame*)AfxGetApp()-&gt;m_pMainWnd;&nbsp; //先通过获取当前框架指针<br>&nbsp;&nbsp;&nbsp; CView * active = pMF-&gt;GetActiveView();//才能获取当前视类指针<br>&nbsp;&nbsp;&nbsp; if(active != NULL)&nbsp; //获取了当前视类指针才能发送消息<br>&nbsp;&nbsp;&nbsp; active-&gt;PostMessage(WM_MY_MESSAGE,0,0);&nbsp;&nbsp; //使用PostMessage发送消息<br>}</p>
<p>对于<span style="COLOR: rgb(204,51,112)">消息的接收者</span>-MessageTestView，<br>在其MessageTestView.h中不要定义<br>static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");<br>应该把这个定义放到MessageTestView.cpp中，要不会出现: redefinition<br>在其MessageTestView.h中只要定义消息映射函数<br>protected:<br>&nbsp;//{{AFX_MSG(CMessageTestView)<br>&nbsp;afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);<br>&nbsp;//}}AFX_MSG<br>&nbsp;DECLARE_MESSAGE_MAP()<br>在其MessageTestView.cpp中,先定义<br>static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");<br>接着注册消息：<br>BEGIN_MESSAGE_MAP(CMessageTestView, CEditView)<br>&nbsp;//{{AFX_MSG_MAP(CMessageTestView)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage)<br>&nbsp;//}}AFX_MSG_MAP<br>最后添加消息响应的函数实现：<br>LRESULT CMessageTestView::OnMyMessage(WPARAM wParam, LPARAM lParam)<br>{<br>&nbsp;MessageBox("OnMyMessage!");<br>&nbsp;return 0;<br>}<br>----------------------------------------------------------------<br>比较两种方法，只是略有不同。但也要小心谨慎，以免出现接收不到消息的情况。</p>
<p>-------------------------------------------------------------------</p>
<p>其他注意事项：</p>
<p>发送消息的-MyMessageDlg.cpp前也要定义<br>static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");</p>
<p>接受消息的-MessageTestView.cpp前也要定义<br>static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");</p>
<p>RegisterWindowMessage("Message")中""的内容是什么不重要，写什么都可以，但是<br>发送者与接受者必须是一样的内容，例如："Message"</p>
</div>
<img src ="http://www.cppblog.com/Lee7/aggbug/47845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-04-22 21:17 <a href="http://www.cppblog.com/Lee7/archive/2008/04/22/47845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文档工程中类之间相互指针的获取</title><link>http://www.cppblog.com/Lee7/archive/2008/04/15/47162.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Tue, 15 Apr 2008 14:41:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/04/15/47162.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/47162.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/04/15/47162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/47162.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/47162.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1) 在View中获得Doc指针2) 在App中获得MainFrame指针3) 在View中获得MainFrame指针4) 获得View（已建立）指针5) 获得当前文档指针6) 获得状态栏与工具栏指针7) 获得状态栏与工具栏变量8) 在Mainframe获得菜单指针9) 在任何类中获得应用程序类10) 从文档类取得视图类的指针(1)11) 在App中获得文档模板指针12) 从文档模板获得文档类指针13) 在文档类中获得文档模板指针14) 从文档类取得视图类的指针(2)15) 从一个视图类取得另一视图类的指针&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/04/15/47162.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/47162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-04-15 22:41 <a href="http://www.cppblog.com/Lee7/archive/2008/04/15/47162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++中的list用法</title><link>http://www.cppblog.com/Lee7/archive/2008/04/14/47036.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Mon, 14 Apr 2008 05:48:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/04/14/47036.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/47036.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/04/14/47036.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/47036.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/47036.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">numeric</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建一个list容器的实例LISTINT&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">typedef&nbsp;list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;LISTINT;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建一个list容器的实例LISTCHAR&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">typedef&nbsp;list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;LISTCHAR;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)&nbsp;<br><img id=Codehighlighter1_229_1742_Open_Image onclick="this.style.display='none'; Codehighlighter1_229_1742_Open_Text.style.display='none'; Codehighlighter1_229_1742_Closed_Image.style.display='inline'; Codehighlighter1_229_1742_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_229_1742_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_229_1742_Closed_Text.style.display='none'; Codehighlighter1_229_1742_Open_Image.style.display='inline'; Codehighlighter1_229_1742_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_229_1742_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_229_1742_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">--------------------------&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用list容器处理整型数据&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">--------------------------&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用LISTINT创建一个名为listOne的list对象&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LISTINT&nbsp;listOne;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">声明i为迭代器&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LISTINT::iterator&nbsp;i;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从前面向listOne容器中添加数据&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;listOne.push_front&nbsp;(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;listOne.push_front&nbsp;(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从后面向listOne容器中添加数据&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;listOne.push_back&nbsp;(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;listOne.push_back&nbsp;(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从前向后显示listOne中的数据&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">listOne.begin()---&nbsp;listOne.end():</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;listOne.begin();&nbsp;i&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;listOne.end();&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">i&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从后向后显示listOne中的数据&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LISTINT::reverse_iterator&nbsp;ir;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">listOne.rbegin()---listOne.rend():</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img id=Codehighlighter1_878_905_Open_Image onclick="this.style.display='none'; Codehighlighter1_878_905_Open_Text.style.display='none'; Codehighlighter1_878_905_Closed_Image.style.display='inline'; Codehighlighter1_878_905_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_878_905_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_878_905_Closed_Text.style.display='none'; Codehighlighter1_878_905_Open_Image.style.display='inline'; Codehighlighter1_878_905_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(ir&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">listOne.rbegin();&nbsp;ir</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">listOne.rend();ir</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_878_905_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_878_905_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ir&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">使用STL的accumulate(累加)算法&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;accumulate(listOne.begin(),&nbsp;listOne.end(),</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Sum=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">result</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">------------------</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">--------------------------&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用list容器处理字符型数据&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">--------------------------&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用LISTCHAR创建一个名为listOne的list对象&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LISTCHAR&nbsp;listTwo;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">声明i为迭代器&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LISTCHAR::iterator&nbsp;j;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从前面向listTwo容器中添加数据&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;listTwo.push_front&nbsp;(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;listTwo.push_front&nbsp;(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从后面向listTwo容器中添加数据&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;listTwo.push_back&nbsp;(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;listTwo.push_back&nbsp;(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从前向后显示listTwo中的数据&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">listTwo.begin()---listTwo.end():</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;listTwo.begin();&nbsp;j&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;listTwo.end();&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">j)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">j)&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">使用STL的max_element算法求listTwo中的最大元素并显示&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">max_element(listTwo.begin(),listTwo.end());&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The&nbsp;maximum&nbsp;element&nbsp;in&nbsp;listTwo&nbsp;is:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">j)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;INTLIST;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从前向后显示list队列的全部元素&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;put_list(INTLIST&nbsp;list,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">name)&nbsp;<br><img id=Codehighlighter1_1898_2075_Open_Image onclick="this.style.display='none'; Codehighlighter1_1898_2075_Open_Text.style.display='none'; Codehighlighter1_1898_2075_Closed_Image.style.display='inline'; Codehighlighter1_1898_2075_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1898_2075_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1898_2075_Closed_Text.style.display='none'; Codehighlighter1_1898_2075_Open_Image.style.display='inline'; Codehighlighter1_1898_2075_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1898_2075_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1898_2075_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;INTLIST::iterator&nbsp;plist;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The&nbsp;contents&nbsp;of&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;name&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(plist&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;list.begin();&nbsp;plist&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;list.end();&nbsp;plist</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">plist&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">测试list容器的功能&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)&nbsp;<br><img id=Codehighlighter1_2111_3837_Open_Image onclick="this.style.display='none'; Codehighlighter1_2111_3837_Open_Text.style.display='none'; Codehighlighter1_2111_3837_Closed_Image.style.display='inline'; Codehighlighter1_2111_3837_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_2111_3837_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2111_3837_Closed_Text.style.display='none'; Codehighlighter1_2111_3837_Open_Image.style.display='inline'; Codehighlighter1_2111_3837_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_2111_3837_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_2111_3837_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">list1对象初始为空&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;INTLIST&nbsp;list1;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">list2对象最初有10个值为6的元素&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;INTLIST&nbsp;list2(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">list3对象最初有3个值为6的元素&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;INTLIST&nbsp;list3(list2.begin(),</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">list2.end());&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">声明一个名为i的双向迭代器&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;INTLIST::iterator&nbsp;i;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从前向后显示各list对象的元素&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;put_list(list1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list2,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list3,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list3</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从list1序列后面添加两个元素&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list1.push_back(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;list1.push_back(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.push_back(2)&nbsp;and&nbsp;list1.push_back(4):</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从list1序列前面添加两个元素&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list1.push_front(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;list1.push_front(</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.push_front(5)&nbsp;and&nbsp;list1.push_front(7):</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在list1序列中间插入数据&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list1.insert(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">list1.begin(),</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.insert(list1.begin()+1,3,9):</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">测试引用类函数&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.front()=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">list1.front()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.back()=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">list1.back()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从list1序列的前后各移去一个元素&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list1.pop_front();&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;list1.pop_back();&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.pop_front()&nbsp;and&nbsp;list1.pop_back():</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">清除list1中的第2个元素&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list1.erase(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">list1.begin());&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.erase(++list1.begin()):</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">对list2赋值并显示&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list2.assign(</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list2.assign(8,1):</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list2,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">显示序列的状态信息&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.max_size():&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">list1.max_size()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.size():&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">list1.size()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1.empty():&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">list1.empty()</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">list序列容器的运算&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;put_list(list1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list3,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list3</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1&gt;list3:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(list1</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">list3)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1&lt;list3:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(list1</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">list3)</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">对list1容器排序&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list1.sort();&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">结合处理&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;list1.splice(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">list1.begin(),&nbsp;list3);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list1,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;put_list(list3,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list3</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img src ="http://www.cppblog.com/Lee7/aggbug/47036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-04-14 13:48 <a href="http://www.cppblog.com/Lee7/archive/2008/04/14/47036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>List,set,Map 的用法和区别等 [转]</title><link>http://www.cppblog.com/Lee7/archive/2008/04/14/47037.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Mon, 14 Apr 2008 05:48:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/04/14/47037.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/47037.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/04/14/47037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/47037.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/47037.html</trackback:ping><description><![CDATA[<div>Collection<br>├List<br>│├LinkedList<br>│├ArrayList<br>│└Vector<br>│　└Stack<br>└Set<br>Map<br>├Hashtable<br>├HashMap<br>└WeakHashMap<br><br>Collection接口<br>　　Collection是最基本的集合接口，一个Collection代表一组Object，即Collection的元素（Elements）。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类，Java SDK提供的类都是继承自Collection的&#8220;子接口&#8221;如List和Set。<br>　　所有实现Collection接口的类都必须提供两个标准的构造函数：无参数的构造函数用于创建一个空的Collection，有一个 Collection参数的构造函数用于创建一个新的Collection，这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。<br>　　如何遍历Collection中的每一个元素？不论Collection的实际类型如何，它都支持一个iterator()的方法，该方法返回一个迭代子，使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下：<br>　　　　Iterator it = collection.iterator(); // 获得一个迭代子<br>　　　　while(it.hasNext()) {<br>　　　　　　Object obj = it.next(); // 得到下一个元素<br>　　　　}<br>　　由Collection接口派生的两个接口是List和Set。<br><br>List接口<br>　　List是有序的Collection，使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引（元素在List中的位置，类似于数组下标）来访问List中的元素，这类似于Java的数组。<br>和下面要提到的Set不同，List允许有相同的元素。<br>　　除了具有Collection接口必备的iterator()方法外，List还提供一个listIterator()方法，返回一个 ListIterator接口，和标准的Iterator接口相比，ListIterator多了一些add()之类的方法，允许添加，删除，设定元素，还能向前或向后遍历。<br>　　实现List接口的常用类有LinkedList，ArrayList，Vector和Stack。<br><br>LinkedList类<br>　　LinkedList实现了List接口，允许null元素。此外LinkedList提供额外的get，remove，insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈（stack），队列（queue）或双向队列（deque）。<br>　　注意LinkedList没有同步方法。如果多个线程同时访问一个List，则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List：<br>　　　　List list = Collections.synchronizedList(new LinkedList(...));<br><br>ArrayList类<br>　　ArrayList实现了可变大小的数组。它允许所有元素，包括null。ArrayList没有同步。<br>size，isEmpty，get，set方法运行时间为常数。但是add方法开销为分摊的常数，添加n个元素需要O(n)的时间。其他的方法运行时间为线性。<br>　　每个ArrayList实例都有一个容量（Capacity），即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加，但是增长算法并没有定义。当需要插入大量元素时，在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。<br>　　和LinkedList一样，ArrayList也是非同步的（unsynchronized）。<br><br>Vector类<br>　　Vector非常类似ArrayList，但是Vector是同步的。由Vector创建的Iterator，虽然和ArrayList创建的 Iterator是同一接口，但是，因为Vector是同步的，当一个Iterator被创建而且正在被使用，另一个线程改变了Vector的状态（例如，添加或删除了一些元素），这时调用Iterator的方法时将抛出ConcurrentModificationException，因此必须捕获该异常。<br><br>Stack 类<br>　　Stack继承自Vector，实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法，还有peek方法得到栈顶的元素，empty方法测试堆栈是否为空，search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。<br><br>Set接口<br>　　Set是一种不包含重复的元素的Collection，即任意的两个元素e1和e2都有e1.equals(e2)=false，Set最多有一个null元素。<br>　　很明显，Set的构造函数有一个约束条件，传入的Collection参数不能包含重复的元素。<br>　　请注意：必须小心操作可变对象（Mutable Object）。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。<br><br>Map接口<br>　　请注意，Map没有继承Collection接口，Map提供key到value的映射。一个Map中不能包含相同的key，每个key只能映射一个 value。Map接口提供3种集合的视图，Map的内容可以被当作一组key集合，一组value集合，或者一组key-value映射。<br><br>Hashtable类<br>　　Hashtable继承Map接口，实现一个key-value映射的哈希表。任何非空（non-null）的对象都可作为key或者value。<br>　　添加数据使用put(key, value)，取出数据使用get(key)，这两个基本操作的时间开销为常数。<br>Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大，这会影响像get和put这样的操作。<br>使用Hashtable的简单示例如下，将1，2，3放到Hashtable中，他们的key分别是&#8221;one&#8221;，&#8221;two&#8221;，&#8221;three&#8221;：<br>　　　　Hashtable numbers = new Hashtable();<br>　　　　numbers.put(&#8220;one&#8221;, new Integer(1));<br>　　　　numbers.put(&#8220;two&#8221;, new Integer(2));<br>　　　　numbers.put(&#8220;three&#8221;, new Integer(3));<br>　　要取出一个数，比如2，用相应的key：<br>　　　　Integer n = (Integer)numbers.get(&#8220;two&#8221;);<br>　　　　System.out.println(&#8220;two = &#8221; + n);<br>　　由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置，因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object，如果你用自定义的类当作key的话，要相当小心，按照散列函数的定义，如果两个对象相同，即obj1.equals(obj2)=true，则它们的hashCode必须相同，但如果两个对象不同，则它们的hashCode不一定不同，如果两个不同对象的hashCode相同，这种现象称为冲突，冲突会导致操作哈希表的时间开销增大，所以尽量定义好的hashCode()方法，能加快哈希表的操作。<br>　　如果相同的对象有不同的hashCode，对哈希表的操作会出现意想不到的结果（期待的get方法返回null），要避免这种问题，只需要牢记一条：要同时复写equals方法和hashCode方法，而不要只写其中一个。<br>　　Hashtable是同步的。<br><br>HashMap类<br>　　HashMap和Hashtable类似，不同之处在于HashMap是非同步的，并且允许null，即null value和null key。，但是将HashMap视为Collection时（values()方法可返回Collection），其迭代子操作时间开销和HashMap 的容量成比例。因此，如果迭代操作的性能相当重要的话，不要将HashMap的初始化容量设得过高，或者load factor过低。<br><br>WeakHashMap类<br>　　WeakHashMap是一种改进的HashMap，它对key实行&#8220;弱引用&#8221;，如果一个key不再被外部所引用，那么该key可以被GC回收。<br><br>总结<br>　　如果涉及到堆栈，队列等操作，应该考虑用List，对于需要快速插入，删除元素，应该使用LinkedList，如果需要快速随机访问元素，应该使用ArrayList。<br>　　如果程序在单线程环境中，或者访问仅仅在一个线程中进行，考虑非同步的类，其效率较高，如果多个线程可能同时操作一个类，应该使用同步的类。<br>　　要特别注意对哈希表的操作，作为key的对象要正确复写equals和hashCode方法。<br>　　尽量返回接口而非实际的类型，如返回List而非ArrayList，这样如果以后需要将ArrayList换成LinkedList时，客户端代码不用改变。这就是针对抽象编程。&nbsp;<br></div>
<img src ="http://www.cppblog.com/Lee7/aggbug/47037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-04-14 13:48 <a href="http://www.cppblog.com/Lee7/archive/2008/04/14/47037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC中自由使用自定义消息</title><link>http://www.cppblog.com/Lee7/archive/2008/03/31/45826.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Mon, 31 Mar 2008 09:10:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/03/31/45826.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/45826.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/03/31/45826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/45826.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/45826.html</trackback:ping><description><![CDATA[　　消息映射、循环机制是Windows程序运行的基本方式。VC++ MFC 中有许多现成的消息句柄，可当我们需要完成其它的任务，需要自定义消息，就遇到了一些困难。在MFC ClassWizard中不允许添加用户自定义消息，所以我们必须在程序中添加相应代码，以便可以象处理其它消息一样处理自定义消息。通常的做法是采取以下步骤:<br><br>　　第一步:定义消息。<br><br>　　推荐用户自定义消息至少是WM_USER+100，因为很多新控件也要使用WM_USER消息。<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>#define WM_MY_MESSAGE (WM_USER+100) </td>
        </tr>
    </tbody>
</table>
<br>　　第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。 <br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) <br>{ <br>// TODO: 处理用户自定义消息 <br>... <br>return 0; <br>} </td>
        </tr>
    </tbody>
</table>
<br>　　第三步:在类头文件的AFX_MSG块中说明消息处理函数:<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>class CMainFrame:public CMDIFrameWnd <br>{ <br>... <br>// 一般消息映射函数 <br>protected: <br>// {{AFX_MSG(CMainFrame) <br>afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); <br>afx_msg void OnTimer(UINT nIDEvent); <br>afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); <br>//}}AFX_MSG <br>DECLARE_MESSAGE_MAP() <br>}</td>
        </tr>
    </tbody>
</table>
<br>　　第四步:在用户类的消息块中，使用ON_MESSAGE宏指令将消息映射到消息处理函数中。 <br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) <br>//{{AFX_MSG_MAP(CMainFrame) <br>ON_WM_CREATE() <br>ON_WM_TIMER() <br>ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage) <br>//}}AFX_MSG_MAP <br>END_MESSAGE_MAP()</td>
        </tr>
    </tbody>
</table>
　　如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage定义消息:<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>static UINT WM_MY_MESSAGE=RegisterWindowMessage("User");</td>
        </tr>
    </tbody>
</table>
<br>　　并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。<br><br>　　当需要使用自定义消息时,可以在相应类中的函数中调用函数PostMessage或SendMessage发送消息PoseMessage(WM_MY_MESSAGE,O,O); 如果向其他进程发送消息可通过如下方法发送消息:<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>DWORD result;<br>SendMessageTimeout(wnd-&gt;m_hWnd, // 目标窗口<br>WM_MY_MESSAGE, // 消息<br>0, // WPARAM<br>0, // LPARAM<br>SMTO_ABORTIFHUNG |<br>SMTO_NORMAL,<br>TIMEOUT_INTERVAL,<br>&amp;result);</td>
        </tr>
    </tbody>
</table>
<br>　　以避免其它进程如果被阻塞而造成系统死等状态。<br><br>　　可是如果需要向其它类(如主框架、子窗口、视类、对话框、状态条、工具条或其他控件等)发送消息时,上述方法显得无能为力，而在编程过程中往往需要获取其它类中的某个识别信号,MFC框架给我们造成了种种限制,但是可以通过获取某个类的指针而向这个类发送消息，而自定义消息的各种动作则在这个类中定义，这样就可以自由自在的向其它类发送消息了。<br><br>　　下面举的例子叙述了向视类和框架类发送消息的方法：<br><br>　　在主框架类中向视类发送消息：<br><br>　　视类中定义消息：<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //定义消息映射<br>视类定义消息处理函数：<br><br>// 消息处理函数<br>LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam)<br>{<br>// TODO: 处理用户自定义消息 <br>... <br>return 0;<br>} <br><br>//发送消息的测试函数<br>void CMainFrame::OnTest()<br>{<br>CView * active = GetActiveView();//获取当前视类指针<br>if(active != NULL)<br>active-&gt;PostMessage(WM_MY_MESSAGE,0,0);<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　在其它类中向视类发送消息：<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>//发送消息的测试函数<br>void CMainFrame::OnTest()<br>{<br>CMDIFrameWnd *pFrame;<br>CMDIChildWnd *pChild;<br>CView *pView;<br>//获取主窗口指针<br>pFrame =(CMDIFrameWnd*)AfxGetApp()-&gt;m_pMainWnd;<br>// 获取子窗口指针<br>pChild = (CMDIChildWnd *) pFrame-&gt;GetActiveFrame();<br>//获取视类指针<br>pView = pChild-&gt;GetActiveView();<br>if(pView != NULL)<br>pView-&gt;PostMessage(WM_MY_MESSAGE,0,0);//发送消息<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　其余步骤同上。<br>　　在视类中向主框架发送消息:<br><br>　　首先在主框架中定义相关的消息,方法同上,然后在发送消息的函数中添加代码如下<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>//发送消息的测试函数<br>void CMessageView::OnTest()<br>{<br>CFrameWnd * active = GetActiveFrame();//获取当前主窗口框架指针<br>if(active != this)<br>active-&gt;PostMessage(WM_MY_MESSAGE,0,0);<br>return 0;<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　在其它类中向不同的类发送消息可依次方法类推，这样我们的程序就可以的不受限制向其它类和进程发送消息，而避免了种种意想不到的风险。<br><br>　　下面一个例子程序为多文档程序里在一对话框中向视类发送消息,详述了发送自定义消息的具体过程。<br>　　<strong><font color=#ac000>实现步骤：</font></strong><br><br>　　第一步：在VC++中新建工程Message，所有ClassWizard步骤选项均为缺省,完成。<br><br>　　第二步：在主菜单中添加测试菜单为调出对话框，在框架类中建立相应函数OnTest()<br><br>　　第三步：在资源中建立对话框，通过ClassWizard添加新类TestDialog,添加测试按钮,<br><br>　　在对话框类中建立相应函数OnDialogTest()<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>//通过对话框按钮发送消息的函数<br>void TestDialog::OnDialogTest()<br>{<br>CMDIFrameWnd *pFrame;<br>CMDIChildWnd *pChild;<br>CView *pView;<br>//获取主窗口指针<br>pFrame =(CMDIFrameWnd*)AfxGetApp()-&gt;m_pMainWnd;<br>// 获取子窗口指针<br>pChild = (CMDIChildWnd *) pFrame-&gt;GetActiveFrame();<br>//获取视类指针<br>pView = pChild-&gt;GetActiveView();<br>if(active != NULL)<br>active-&gt;PostMessage(WM_MY_MESSAGE,0,0);//发送消息<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　在Message.h头文件中添加如下语句：<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");</td>
        </tr>
    </tbody>
</table>
<br>　　第四步:在视类中添加自定义消息:<br><br>　　在头文件MessageView.h中添加消息映射<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>protected:<br>//{{AFX_MSG(CMessageView)<br>//}}AFX_MSG<br>afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); //此行为添加代码<br>DECLARE_MESSAGE_MAP()<br>在视类文件MessageView.cpp中的消息映射中添加自定义消息映射<br>BEGIN_MESSAGE_MAP(CMessageView, CView)<br>//{{AFX_MSG_MAP(CMessageView)<br>//}}AFX_MSG_MAP<br>// Standard printing commands<br>ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //此行添加代码定义唯一消息<br>END_MESSAGE_MAP()</td>
        </tr>
    </tbody>
</table>
<br>　　添加相应的0消息处理函数<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAM lParam)<br>{<br>CRect rect;<br>GetClientRect(&amp;rect);<br>InvalidateRect(&amp;rect);<br>test=!test;<br>return 0;<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　在MessageView.h中添加布尔变量 public:BOOL test;<br><br>　　在视类构造函数中初始化 test变量:test=FALSE;<br><br>　　修改CMessageView::OnDraw()函数<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>void CMessageView::OnDraw(CDC* pDC)<br>{<br>CMessageDoc* pDoc = GetDocument();<br>ASSERT_VALID(pDoc);<br>// 以下程序显示消息响应效果<br>if(test)<br>pDC-&gt;TextOut(0,0,"消息响应!");<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　第五步：显示测试对话框<br><br>　　在MainFrame类中包含对话框头文件：<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" bgColor=#ffffff border=0>
    <tbody>
        <tr>
            <td>#include "TestDialog.h";<br>OnTest()函数中添加代码<br>void CMainFrame::OnTest()<br>{<br>TestDialog dialog;<br>dialog.DoModal();<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　运行程序,在测试菜单打开对话框,点击测试按钮即可看到结果。<br><br>
<img src ="http://www.cppblog.com/Lee7/aggbug/45826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-03-31 17:10 <a href="http://www.cppblog.com/Lee7/archive/2008/03/31/45826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈C中的malloc和free</title><link>http://www.cppblog.com/Lee7/archive/2008/03/22/45133.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Sat, 22 Mar 2008 13:49:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/03/22/45133.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/45133.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/03/22/45133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/45133.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/45133.html</trackback:ping><description><![CDATA[在C语言的学习中，对内存管理这部分的知识掌握尤其重要！之前对C中的malloc()和free()两个函数的了解甚少，只知道大概该怎么用——
就是malloc然后free就一切OK了。当然现在对这两个函数的体会也不见得多，不过对于本文章第三部分的内容倒是有了转折性的认识，所以
<p>写下这篇文章作为一个对知识的总结。这篇文章之所以命名中有个&#8220;浅谈&#8221;的字眼，也就是这个意思了！希望对大家有一点帮助！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 如果不扯得太远的话（比如说操作系统中虚拟内存和物理内存如何运做如何管理之类的知识等），我感觉这篇文章应该是比较全面地谈了一下malloc()和free().这篇文章由浅入深（不见得有多深）分三个部分介绍主要内容。</p>
<p>废话了那么多，下面立刻进入主题================》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》</p>
<p><br>一、malloc()和free()的基本概念以及基本用法：</p>
<p>1、函数原型及说明：</p>
<p>void *malloc(long NumBytes)：该函数分配了NumBytes个字节，并返回了指向这块内存的指针。如果分配失败，则返回一个空指针（NULL）。</p>
<p>关于分配失败的原因，应该有多种，比如说空间不足就是一种。</p>
<p>void free(void *FirstByte)： 该函数是将之前用malloc分配的空间还给程序或者是操作系统，也就是释放了这块内存，让它重新得到自由。</p>
<p>2、函数的用法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 其实这两个函数用起来倒不是很难，也就是malloc()之后觉得用够了就甩了它把它给free()了，举个简单例子：</p>
<div class="htmlcode"><font style="font-weight: bold; color: #333333;">程序代码：</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Code... <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*Ptr&nbsp;=&nbsp;NULL; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ptr&nbsp;=&nbsp;(char&nbsp;*)malloc(100&nbsp;*&nbsp;sizeof(char)); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(NULL&nbsp;==&nbsp;Ptr) <br>&nbsp;&nbsp;&nbsp;&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;(1); <br>&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gets(Ptr); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;code... <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(Ptr); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ptr&nbsp;=&nbsp;NULL; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;code...</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;就是这样！当然，具体情况要具体分析以及具体解决。比如说，你定义了一个指针，在一个函数里申请了一块内存然后通过函数返回传递给这个指针，那么也许释放这块内存这项工作就应该留给其他函数了。</p>
<p>3、关于函数使用需要注意的一些地方：</p>
<p>A、申请了内存空间后，必须检查是否分配成功。</p>
<p>B、当不需要再使用申请的内存时，记得释放；释放后应该把指向这块内存的指针指向NULL，防止程序后面不小心使用了它。</p>
<p>C、这两个函数应该是配对。如果申请后不释放就是内存泄露；如果无故释放那就是什么也没有做。释放只能一次，如果释放两次及两次以上会</p>
<p>出现错误（释放空指针例外，释放空指针其实也等于啥也没做，所以释放空指针释放多少次都没有问题）。</p>
<p>D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换，因为这样可以躲过一</p>
<p>些编译器的检查。</p>
<p>好了！最基础的东西大概这么说！现在进入第二部分：</p>
<p><br>二、malloc()到底从哪里得来了内存空间：</p>
<p>1、malloc()到底从哪里得到了内存空间？答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空
闲内存地址的链表。当操作系统收到程序的申请时，就会遍历该链表，然后就寻找第一个空间大于所申请空间的堆结点，然后就将该结点从空闲结点链表中删除，并
将该结点的空间分配给程序。就是这样！</p>
<p>&nbsp;&nbsp; 说到这里，不得不另外插入一个小话题，相信大家也知道是什么话题了。什么是堆？说到堆，又忍不住说到了栈！什么是栈？下面就另外开个小部分专门而又简单地说一下这个题外话：</p>
<p>2、什么是堆：堆是大家共有的空间，分全局堆和局部堆。全局堆就是所有没有分配的空间，局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配，运行过程中也可以向系统要额外的堆，但是记得用完了要还给操作系统，要不然就是内存泄漏。</p>
<p>&nbsp;&nbsp;
什么是栈：栈是线程独有的，保存其运行状态和局部自动变量的。栈在线程开始的时候初始化，每个线程的栈互相独立。每个函数都有自己的栈，栈被用来在函数之
间传递参数。操作系统在切换线程的时候会自动的切换栈，就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。 </p>
<p>&nbsp;&nbsp; 以上的概念描述是标准的描述，不过有个别语句被我删除，不知道因为这样而变得不标准了^_^.</p>
<p>&nbsp;&nbsp; 通过上面对概念的描述，可以知道：</p>
<p>&nbsp;&nbsp; 栈是由编译器自动分配释放，存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。</p>
<p>&nbsp;&nbsp; 堆一般由程序员分配释放，若不释放，程序结束时可能由OS回收。注意这里说是可能，并非一定。所以我想再强调一次，记得要释放！</p>
注意它与数据结构中的堆是两回事，分配方式倒是类似于链表。<br>所以，举个例子，如果你在函数上面定义了一个指针变量，然后在这个函数里申请了一块内存让指针指向它。实际上，这个指针的地址是在栈上，但是它所指向的内容却是在堆上面的！这一点要注意！所以，再想想，在一个函数里申请了空间后，比如说下面这个函数：
<div class="htmlcode"><font style="font-weight: bold; color: #333333;">程序代码：</font><br>&nbsp;&nbsp;&nbsp;//&nbsp;code... <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;Function(void) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*p&nbsp;=&nbsp;(char&nbsp;*)malloc(100&nbsp;*&nbsp;sizeof(char)); <br>&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<p><br>&nbsp;&nbsp;<br>&nbsp;&nbsp; 就这个例子，千万不要认为函数返回，函数所在的栈被销毁指针也跟着销毁，申请的内存也就一样跟着销毁了！这绝对是错误的！因为申请的内存在堆上，而函数所在的栈被销毁跟堆完全没有啥关系。所以，还是那句话：记得释放！</p>
<p>3、free()到底释放了什么</p>
<p>&nbsp;&nbsp;
这个问题比较简单，其实我是想和第二大部分的题目相呼应而已！哈哈！free()释放的是指针指向的内存！注意！释放的是内存，不是指针！这点非常非常重
要！指针是一个变量，只有程序结束时才被销毁。释放了内存空间后，原来指向这块空间的指针还是存在！只不过现在指针指向的内容的垃圾，是未定义的，所以说
是垃圾。因此，前面我已经说过了，释放内存后把指针指向NULL，防止指针在后面不小心又被解引用了。非常重要啊这一点！</p>
<p>&nbsp;&nbsp; 好了！这个&#8220;题外话&#8221;终于说完了。就这么简单说一次，知道个大概就可以了！下面就进入第三个部分：</p>
<p>三、malloc()以及free()的机制：</p>
<p>&nbsp;&nbsp; 这个部分我今天才有了新的认识！而且是转折性的认识！所以，这部分可能会有更多一些认识上的错误！不对的地方请大家帮忙指出！</p>
<p>&nbsp;&nbsp; 事实上，仔细看一下free()的函数原型，也许也会发现似乎很神奇，free()函数非常简单，只有一个参数，只要把指向申请空间的指针传递</p>
<p>给free()中的参数就可以完成释放工作！这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在《UNIX环境高级编程》中第七章的一段话：</p>
<p>&nbsp;&nbsp;
大多数实现所分配的存储空间比所要求的要稍大一些，额外的空间用来记录管理信息——分配块的长度，指向下一个分配块的指针等等。这就意味着如果写过一个已
分配区的尾端，则会改写后一块的管理信息。这种类型的错误是灾难性的，但是因为这种错误不会很快就暴露出来，所以也就很难发现。将指向分配块的指针向后移
动也可能会改写本块的管理信息。</p>
<p>&nbsp;&nbsp; 以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间，另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中，用结构体来记录同一个对象的不同信息是</p>
<p>天经地义的事！下面看看这个结构体的原型：</p>
<div class="htmlcode"><font style="font-weight: bold; color: #333333;">程序代码：</font><br>&nbsp;&nbsp;&nbsp;struct&nbsp;mem_control_block&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;is_available;&nbsp;&nbsp;&nbsp;&nbsp;//这是一个标记？ <br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这是实际空间的大小 <br>&nbsp;&nbsp;&nbsp;&nbsp;};</div>
<p><br>&nbsp;&nbsp;<br>&nbsp;&nbsp; 对于size,这个是实际空间大小。这里其实我有个疑问，is_available是否是一个标记？因为我看了free()的源代码之后对这个变量感觉有点纳闷（源代码在下面分析）。这里还请大家指出！</p>
<p>&nbsp;&nbsp;
所以，free()就是根据这个结构体的信息来释放malloc()申请的空间！而结构体的两个成员的大小我想应该是操作系统的事了。但是这里有一个问
题，malloc()申请空间后返回一个指针应该是指向第二种空间，也就是可用空间！不然，如果指向管理信息空间的话，写入的内容和结构体的类型有可能不
一致，或者会把管理信息屏蔽掉，那就没法释放内存空间了，所以会发生错误！（感觉自己这里说的是废话）</p>
<p>&nbsp;&nbsp; 好了！下面看看free()的源代码，我自己分析了一下，觉得比起malloc()的源代码倒是容易简单很多。只是有个疑问，下面指出！</p>
<div class="htmlcode"><font style="font-weight: bold; color: #333333;">程序代码：</font><br>&nbsp;&nbsp;&nbsp;//&nbsp;code... <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;free(void&nbsp;*ptr)&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;mem_control_block&nbsp;*free; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free&nbsp;=&nbsp;ptr&nbsp;-&nbsp;sizeof(struct&nbsp;mem_control_block); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free-&gt;is_available&nbsp;=&nbsp;1; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return; <br>&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<p>&nbsp;&nbsp;
看一下函数第二句，这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去，让它指向管理信息的那块空间，因为这里是在值上减去了一个结构体的大
小！后面那一句free-&gt;is_available =
1;我有点纳闷！我的想法是：这里is_available应该只是一个标记而已！因为从这个变量的名称上来看，is_available
翻译过来就是&#8220;是可以用&#8221;。不要说我土！我觉得变量名字可以反映一个变量的作用，特别是严谨的代码。这是源代码，所以我觉得绝对是严谨的！！这个变量的值
是1，表明是可以用的空间！只是这里我想了想，如果把它改为0或者是其他值不知道会发生什么事？！但是有一点我可以肯定，就是释放绝对不会那么顺利进行！
因为这是一个标记！</p>
<p>&nbsp;&nbsp;
当然，这里可能还是有人会有疑问，为什么这样就可以释放呢？？我刚才也有这个疑问。后来我想到，释放是操作系统的事，那么就free()这个源代码来看，
什么也没有释放，对吧？但是它确实是确定了管理信息的那块内存的内容。所以，free()只是记录了一些信息，然后告诉操作系统那块内存可以去释放，具体
怎么告诉操作系统的我不清楚，但我觉得这个已经超出了我这篇文章的讨论范围了。</p>
<p>&nbsp;&nbsp;
那么，我之前有个错误的认识，就是认为指向那块内存的指针不管移到那块内存中的哪个位置都可以释放那块内存！但是，这是大错特错！释放是不可以释放一部分
的！首先这点应该要明白。而且，从free()的源代码看，ptr只能指向可用空间的首地址，不然，减去结构体大小之后一定不是指向管理信息空间的首地
址。所以，要确保指针指向可用空间的首地址！不信吗？自己可以写一个程序然后移动指向可用空间的指针，看程序会有会崩！</p>
<p>&nbsp;&nbsp; 最后可能想到malloc()的源代码看看malloc()到底是怎么分配空间的，这里面涉及到很多其他方面的知识！有兴趣的朋友可以自己去下载源<br>代码去看看。</p>
<p><br>四、关于其他：</p>
&nbsp;&nbsp;&nbsp;&nbsp;关于C中的malloc()和free()的讨论就写到这里吧！写了三个钟头，感觉有点累！希望对大家有所帮助！有不对的地方欢迎大家指出<br><img src ="http://www.cppblog.com/Lee7/aggbug/45133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-03-22 21:49 <a href="http://www.cppblog.com/Lee7/archive/2008/03/22/45133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mfc框架结合sdk的学习笔记(一) [转]</title><link>http://www.cppblog.com/Lee7/archive/2008/02/20/43014.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Wed, 20 Feb 2008 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/02/20/43014.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/43014.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/02/20/43014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/43014.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/43014.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: mfc框架结合sdk的学习笔记(一)&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/02/20/43014.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/43014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-02-20 22:47 <a href="http://www.cppblog.com/Lee7/archive/2008/02/20/43014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++中回调函数初探</title><link>http://www.cppblog.com/Lee7/archive/2008/02/18/42908.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Mon, 18 Feb 2008 12:35:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/02/18/42908.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/42908.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/02/18/42908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/42908.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/42908.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 对于很多初学者来说，往往觉得回调函数很神秘，很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题，在开始之前，假设你已经熟知了函数指针&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/02/18/42908.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/42908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-02-18 20:35 <a href="http://www.cppblog.com/Lee7/archive/2008/02/18/42908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IP地址转换函数：</title><link>http://www.cppblog.com/Lee7/archive/2008/01/28/42027.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Mon, 28 Jan 2008 06:32:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/01/28/42027.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/42027.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/01/28/42027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/42027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/42027.html</trackback:ping><description><![CDATA[&nbsp;
<p style="FONT-SIZE: 14pt"><font size=6>IP地址转换函数：</font></p>
<font size=+2>
<blockquote>
<p style="FONT-SIZE: 14pt">unsigned long inet_addr (const char *cp);</p>
<blockquote>
<p style="FONT-SIZE: 14pt">inet_addr将一个点分十进制IP地址字符串转换成32位数字表示的IP地址（网络字节顺序）。</p>
</blockquote>
<p style="FONT-SIZE: 14pt">&nbsp;&nbsp; </p>
<p style="FONT-SIZE: 14pt">char* inet_ntoa (struct in_addr in);</p>
<blockquote>
<p style="FONT-SIZE: 14pt">inet_ntoa将一个32位数字表示的IP地址转换成点分十进制IP地址字符串。</p>
</blockquote>
<p style="FONT-SIZE: 14pt">　</p>
<p style="FONT-SIZE: 14pt">这两个函数互为反函数</p>
</blockquote></font>
<p style="FONT-SIZE: 14pt">&nbsp;&nbsp; </p>
<p style="FONT-SIZE: 14pt">　</p>
<p style="FONT-SIZE: 14pt"><font size=6>字节顺序转换</font></p>
<font size=+2>
<blockquote>
<p style="FONT-SIZE: 14pt">htons()--"Host to Network Short"</p>
<p style="FONT-SIZE: 14pt">htonl()--"Host to Network Long"</p>
<p style="FONT-SIZE: 14pt">ntohs()--"Network to Host Short"</p>
<p style="FONT-SIZE: 14pt">ntohl()--"Network to Host Long"</p>
*注意:在你的数据放到网络上的时候，确信它是网络字节顺序<br>网络字节顺序(大端字节)和x86机器字节顺序(小端字节)<br>eg:0X3132&nbsp; 在x86上显示21&nbsp; 在网络传输中为12<br></blockquote></font>
<img src ="http://www.cppblog.com/Lee7/aggbug/42027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-01-28 14:32 <a href="http://www.cppblog.com/Lee7/archive/2008/01/28/42027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的错误处理</title><link>http://www.cppblog.com/Lee7/archive/2008/01/26/41932.html</link><dc:creator>isabc</dc:creator><author>isabc</author><pubDate>Sat, 26 Jan 2008 03:31:00 GMT</pubDate><guid>http://www.cppblog.com/Lee7/archive/2008/01/26/41932.html</guid><wfw:comment>http://www.cppblog.com/Lee7/comments/41932.html</wfw:comment><comments>http://www.cppblog.com/Lee7/archive/2008/01/26/41932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee7/comments/commentRss/41932.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee7/services/trackbacks/41932.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 处理在程序的运行时刻发生的错误，对于任何一个程序设计者来讲都是不陌生的。对于错误的处理，我们有很多方法，本篇着重介绍的是C++中的错误异常处理。&nbsp;&nbsp;<a href='http://www.cppblog.com/Lee7/archive/2008/01/26/41932.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee7/aggbug/41932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee7/" target="_blank">isabc</a> 2008-01-26 11:31 <a href="http://www.cppblog.com/Lee7/archive/2008/01/26/41932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>