﻿<?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 Dec 2008 07:01:34 GMT</lastBuildDate><pubDate>Sun, 14 Dec 2008 07:01:34 GMT</pubDate><ttl>60</ttl><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>6</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</pubDat