<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>◇ 编程 电脑</title><link>http://blog.vckbase.com/hatemath/category/734.html</link><description>这里放的多是和VC编程、电脑软硬件、windows和linux系统有关的随笔。
点击题目列表最下面的“显示全部 ◇ 编程 电脑 文档 ”查看此类目所有随笔。</description><managingEditor>hATEmATH的网上田园</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>hATEmATH的网上田园</dc:creator><title>(转载)C/C++数组名与指针区别深层探索</title><link>http://blog.vckbase.com/hatemath/archive/2008/09/26/35134.html</link><pubDate>Fri, 26 Sep 2008 02:00:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2008/09/26/35134.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/35134.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2008/09/26/35134.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/35134.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/35134.html</trackback:ping><description>早看到这篇文章就好了，免得自己摸索了很久。不过，文章如果能进一步说明数组地址++和指向数组的指针++对地址的影响，就更能说明问题。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;C/C++数组名与指针区别深层探索&lt;BR&gt;作者：宋宝华 e-mail:21cnbao@21cn.com&lt;BR&gt;&lt;BR&gt;1. 引言&lt;BR&gt;指针是C/C++语言的特色，而数组名与指针有太多的相似，甚至很多时候，数组名可以作为指针使用。于是乎，很多&lt;BR&gt;程序设计者就被搞糊涂了。而许多的大学老师，他们在C 语言的教学过程中也错误得给学生讲解：&amp;#8220;数组名就是指针&amp;#8221;。&lt;BR&gt;很幸运，我的大学老师就是其中之一。时至今日，我日复一日地进行着C/C++项目的开发，而身边还一直充满这样的&lt;BR&gt;程序员，他们保留着&amp;#8220;数组名就是指针&amp;#8221;的误解。&lt;BR&gt;&lt;BR&gt;2. 魔幻数组名&lt;BR&gt;请看程序（本文程序在WIN32 平台下编译）：&lt;BR&gt;1. #include &amp;lt;iostream.h&amp;gt;&lt;BR&gt;2. int main(int argc, char* argv[])&lt;BR&gt;3. {&lt;BR&gt;4. char str[10];&lt;BR&gt;5. char *pStr = str;&lt;BR&gt;6. cout &amp;lt;&amp;lt; sizeof(str) &amp;lt;&amp;lt; endl;&lt;BR&gt;7. cout &amp;lt;&amp;lt; sizeof(pStr) &amp;lt;&amp;lt; endl;&lt;BR&gt;8. return 0;&lt;BR&gt;9. }&lt;BR&gt;2.1 数组名不是指针&lt;BR&gt;我们先来推翻&amp;#8220;数组名就是2.1 数组名不是指针&lt;BR&gt;我们先来推翻&amp;#8220;数组名就是指针&amp;#8221;的说法，用反证法。&lt;BR&gt;证明 数组名不是指针&lt;BR&gt;假设：数组名是指针；&lt;BR&gt;则：pStr 和str 都是指针；&lt;BR&gt;因为：在WIN32 平台下，指针长度为4；&lt;BR&gt;所以：第6 行和第7 行的输出都应该为4；&lt;BR&gt;实际情况是：第6 行输出10，第7 行输出4；&lt;BR&gt;所以：假设不成立，数组名不是指针&lt;BR&gt;2.2 数组名神似指针&lt;BR&gt;上面我们已经证明了数组名的确不是指针，但是我们再看看程序的第5 行。该行程序将数组名直接赋值给指针，这显得数组名又的确是个指针！&lt;BR&gt;我们还可以发现数组名显得像指针的例子：&lt;BR&gt;1. #include &amp;lt;string.h&amp;gt;&lt;BR&gt;2. #include &amp;lt;iostream.h&amp;gt;&lt;BR&gt;3. int main(int argc, char* argv[])&lt;BR&gt;4. {&lt;BR&gt;5. char str1[10] = "I Love U";&lt;BR&gt;6. char str2[10];&lt;BR&gt;7. strcpy(str2,str1);&lt;BR&gt;8. cout &amp;lt;&amp;lt; "string array 1: " &amp;lt;&amp;lt; str1 &amp;lt;&amp;lt; endl;&lt;BR&gt;9. cout &amp;lt;&amp;lt; "string array 2: " &amp;lt;&amp;lt; str2 &amp;lt;&amp;lt; endl;&lt;BR&gt;10. return 0;&lt;BR&gt;11. }&lt;BR&gt;标准C 库函数strcpy 的函数原形中能接纳的两个参数都为char 型指针，而我们在调用中传给它的却是两个数组名！&lt;BR&gt;函数输出：&lt;BR&gt;string array 1: I Love U&lt;BR&gt;string array 2: I Love U&lt;BR&gt;数组名再一次显得像指针！&lt;BR&gt;既然数组名不是指针，而为什么到处都把数组名当指针用？于是乎，许多程序员得出这样的结论：数组名（主）是（谓）&lt;BR&gt;不是指针的指针（宾）。&lt;BR&gt;整个一魔鬼。&lt;BR&gt;&lt;BR&gt;3. 数组名大揭密&lt;BR&gt;那么，是揭露数组名本质的时候了，先给出三个结论：&lt;BR&gt;&lt;STRONG&gt;(1)数组名的内涵在于其指代实体是一种数据结构，这种数据结构就是数组；&lt;BR&gt;(2)数组名的外延在于其可以转换为指向其指代实体的指针，而且是一个指针常量；&lt;BR&gt;(3)指向数组的指针则是另外一种变量类型（在WIN32 平台下，长度为4），仅仅意味着数组的存放地址！&lt;BR&gt;&lt;/STRONG&gt;3.1 数组名指代一种数据结构：数组&lt;BR&gt;现在可以解释为什么第1 个程序第6 行的输出为10 的问题，根据结论1，数组名str 的内涵为一种数据结构，即一&lt;BR&gt;个长度为10 的char 型数组，所以sizeof(str)的结果为这个数据结构占据的内存大小：10 字节。&lt;BR&gt;再看：&lt;BR&gt;1. int intArray[10];&lt;BR&gt;2. cout &amp;lt;&amp;lt; sizeof(intArray) ;&lt;BR&gt;第2 行的输出结果为40（整型数组占据的内存空间大小）。&lt;BR&gt;如果C/C++程序可以这样写：&lt;BR&gt;1. int[10] intArray;&lt;BR&gt;2. cout &amp;lt;&amp;lt; sizeof(intArray) ;&lt;BR&gt;我们就都明白了，intArray 定义为int[10]这种数据结构的一个实例，可惜啊，C/C++目前并不支持这种定义方式。&lt;BR&gt;3.2 数组名可作为指针常量&lt;BR&gt;根据结论2，数组名可以转换为指向其指代实体的指针，所以程序1 中的第5 行数组名直接赋值给指针，程序2 第7&lt;BR&gt;行直接将数组名作为指针形参都可成立。&lt;BR&gt;下面的程序成立吗？&lt;BR&gt;1. int intArray[10];&lt;BR&gt;2. intArray++;&lt;BR&gt;读者可以编译之，发现编译出错。原因在于，虽然数组名可以转换为指向其指代实体的指针，但是它只能被看作一个指针常量，不能被修改。&lt;BR&gt;而指针，不管是指向结构体、数组还是基本数据类型的指针，都不包含原始数据结构的内涵，在WIN32 平台下，sizeof&lt;BR&gt;操作的结果都是4。&lt;BR&gt;顺便纠正一下许多程序员的另一个误解。许多程序员以为sizeof 是一个函数，而实际上，它是一个操作符，不过其&lt;BR&gt;使用方式看起来的确太像一个函数了。语句sizeof(int)就可以说明sizeof 的确不是一个函数，因为函数接纳形参&lt;BR&gt;（一个变量），世界上没有一个C/C++函数接纳一个数据类型（如int）为&amp;#8220;形参&amp;#8221;。&lt;BR&gt;3.3 数据名可能失去其数据结构内涵&lt;BR&gt;到这里似乎数组名魔幻问题已经宣告圆满解决，但是平静的湖面上却再次掀起波浪。请看下面一段程序：&lt;BR&gt;1. #include &amp;lt;iostream.h&amp;gt;&lt;BR&gt;2. void arrayTest(char str[])&lt;BR&gt;3. {&lt;BR&gt;4. cout &amp;lt;&amp;lt; sizeof(str) &amp;lt;&amp;lt; endl;&lt;BR&gt;5. }&lt;BR&gt;6. int main(int argc, char* argv[])&lt;BR&gt;7. {&lt;BR&gt;8. char str1[10] = "I Love U";&lt;BR&gt;9. arrayTest(str1);&lt;BR&gt;10. return 0;&lt;BR&gt;11. }&lt;BR&gt;程序的输出结果为4。不可能吧？&lt;BR&gt;4，一个可怕的数字，前面已经提到其为指针的长度!&lt;BR&gt;结论1 指出，数据名内涵为数组这种数据结构，在arrayTest 函数体内，str 是数组名，那为什么sizeof 的结果却&lt;BR&gt;是指针的长度？这是因为：&lt;BR&gt;(1)数组名作为函数形参时，在函数体内，其失去了本身的内涵，仅仅只是一个指针；&lt;BR&gt;(2)很遗憾，在失去其内涵的同时，它还失去了其常量特性，可以作自增、自减等操作，可以被修改。&lt;BR&gt;所以，数据名作为函数形参时，其全面沦落为一个普通指针！它的贵族身份被剥夺，成了一个地地道道的只拥有4&lt;BR&gt;个字节的平民。&lt;BR&gt;以上就是结论4。&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/35134.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hATEmATH的网上田园</dc:creator><title>技术发展的高原期，怎么办？</title><link>http://blog.vckbase.com/hatemath/archive/2008/09/11/34963.html</link><pubDate>Thu, 11 Sep 2008 07:10:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2008/09/11/34963.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/34963.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2008/09/11/34963.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/34963.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/34963.html</trackback:ping><description>&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这几天，csdn上有个学VB的人向我请教如何学API。ta在学API的时候总觉得不得要领，云里雾里的摸不着边。作为一个曾痴迷VB6数年的爱好者，我当然很热情的回复了ta，根据自己的经验教训给ta指了一条明路。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;然后回头想想自己，其实自己也遇到了类似的问题。本人学的是C语言，从事的是嵌入式开发工作。用C语言也有几个年头了，也有若干项目经验，可是总觉得自己的C水平还很一般，只能说会用C做项目，不敢说&amp;#8220;精通&amp;#8221;二字，甚至说&amp;#8220;熟练&amp;#8221;都觉得有些不妥。怎么才能让自己的水平有更多的进步呢？要进一步学习哪些东西？各位达人可否给点意见，不胜感谢。&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/34963.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hATEmATH的网上田园</dc:creator><title>BASE64编解码JPG图片的例子(C++ VS2005)</title><link>http://blog.vckbase.com/hatemath/archive/2008/09/01/34871.html</link><pubDate>Mon, 01 Sep 2008 01:48:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2008/09/01/34871.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/34871.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2008/09/01/34871.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/34871.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/34871.html</trackback:ping><description>&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BASE64这种编码挺有意思的，可以把每3个（二进制）字节编码成以ASCII码表示的4个字节。可能会有人觉得奇怪，网页保存为mht格式后，明明只有一个文本文件，可是用浏览器打开后居然还有图片。其实，用记事本打开这些mht文件，可以看到一堆堆的&amp;#8221;乱码&amp;#8220;，这往往就是BASE64编码后的图片了。由于最近项目用到这个东西，于是去CSDN上下了个BASE64编解码的C++类。因为对效率没有特别的要求，所以只是用小图片试了一下，能用。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;该类使用起来很简单：&lt;BR&gt;
&lt;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: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;main(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;argc,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;char&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;argv[])&lt;BR&gt;&lt;IMG id=Codehighlighter1_33_302_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_302_Open_Text.style.display='none'; Codehighlighter1_33_302_Closed_Image.style.display='inline'; Codehighlighter1_33_302_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_33_302_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_33_302_Closed_Text.style.display='none'; Codehighlighter1_33_302_Open_Image.style.display='inline'; Codehighlighter1_33_302_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_33_302_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"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_33_302_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;strJpg;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Base64&amp;nbsp;bs;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;read_from_binary_file(strJpg); // 读取文件&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;strEncode&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;bs.base64_encode(strJpg); // 编码&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;strDecode&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;bs.base64_decode(strEncode); //解码&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write_to_binary_file(strDecode); // 写入文件&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;%s %s &lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;,&amp;nbsp;strEncode.c_str(),&amp;nbsp;strDecode.c_str()); // 在控制台打印&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;例子（源码+demo）下载：&lt;BR&gt;&lt;A href="http://blog.vckbase.com/Files/HateMath/base64_codec_jpg_test.rar"&gt;http://blog.vckbase.com/Files/HateMath/base64_codec_jpg_test.rar&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;后补：&lt;/FONT&gt;上面那个理论上只适合文本文件，对于二进制文件，有时是不行的。这个例子更具有通用性：&lt;BR&gt;&lt;A href="http://blog.vckbase.com/Files/HateMath/test_base64_bmp.rar"&gt;http://blog.vckbase.com/Files/HateMath/test_base64_bmp.rar&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/34871.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hATEmATH的网上田园</dc:creator><title>《高质量C++编程指南》 摘录</title><link>http://blog.vckbase.com/hatemath/archive/2008/07/29/34526.html</link><pubDate>Tue, 29 Jul 2008 09:32:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2008/07/29/34526.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/34526.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2008/07/29/34526.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/34526.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/34526.html</trackback:ping><description>&lt;P&gt;&lt;BR&gt;是摘录，所以只是自己感兴趣的部分，一般是自己不熟悉的地方和觉得讲述的很好的地方。&lt;BR&gt;&lt;BR&gt;第六章&amp;nbsp; 函数设计&lt;BR&gt;&lt;BR&gt;&amp;gt; 如果函数没有参数，则用void 填充.明确的告诉别人，此函数没有参数。&lt;/P&gt;
&lt;P&gt;&amp;gt; 有时候函数原本不需要返回值，但为了增加灵活性如支持链式表达，可以附加返回值。&lt;BR&gt;例如字符串拷贝函数strcpy 的原型：&lt;BR&gt;char *strcpy(char *strDest，const char *strSrc);&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;gt; 断言用来捕捉程序员认为不应该发生的情况&lt;BR&gt;在编写函数时，先自问：&amp;#8220;我打算做哪些假定？&amp;#8221;一旦确定了的假定，就要使用断言对假定进行检查。&lt;/P&gt;
&lt;P&gt;&amp;gt; int m;&lt;BR&gt;int &amp;amp; n = m;&lt;BR&gt;n 相当于m 的别名（绰号），对n 的任何操作就是对m 的操作。例如有人名叫王小毛，&lt;BR&gt;他的绰号是&amp;#8220;三毛&amp;#8221;。说&amp;#8220;三毛&amp;#8221;怎么怎么的，其实就是对王小毛说三道四。&lt;/P&gt;
&lt;P&gt;引用和指针的区别：&lt;BR&gt;（1）引用被创建的同时必须被初始化（指针则可以在任何时候被初始化）。&lt;BR&gt;（2）不能有NULL 引用，引用必须与合法的存储单元关联（指针则可以是NULL）。&lt;BR&gt;（3）一旦引用被初始化，就不能改变引用的关系（指针则可以随时改变所指的对象）。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;gt; 实际上&amp;#8220;引用&amp;#8221;可以做的任何事情&amp;#8220;指针&amp;#8221;也都能够做，为什么还要&amp;#8220;引用&amp;#8221;这东西？&lt;BR&gt;答案是&amp;#8220;用适当的工具做恰如其分的工作&amp;#8221;。&lt;BR&gt;指针能够毫无约束地操作内存中的如何东西，尽管指针功能强大，但是非常危险。如果只需要借用一下某个对象的&amp;#8220;别名&amp;#8221;，那么就用&amp;#8220;引用&amp;#8221;，而不要用&amp;#8220;指针&amp;#8221;，以免发生意外。比如说，某人需要一份证明，本来在文件上盖上公章的印子就行了，如果把取公章的钥匙交给他，那么他就获得了不该有的权利，从而产生潜在的危险。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;第7 章 内存管理&lt;BR&gt;&lt;BR&gt;&amp;gt; C++/C 语言没有办法知道指针所指的内存容量，除非在申请内存时记住它。&lt;/P&gt;
&lt;P&gt;&amp;gt; 当数组作为函数的参数进行传递时，该数组自动退化为同类型的指针&lt;/P&gt;
&lt;P&gt;&amp;gt; 如果函数的参数是一个指针，不要指望用该指针去申请动态内存。因为编译器总是要为函数的每个参数制作临时副本，指针亦同。&lt;/P&gt;&amp;gt; 
&lt;P&gt;&lt;BR&gt;第9 章 类的构造函数、析构函数与赋值函数&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;gt; 构造函数有个特殊的初始化方式叫&amp;#8220;初始化表达式表&amp;#8221;（简称初始化表）。初始化表&lt;BR&gt;位于函数参数表之后，却在函数体 {} 之前。这说明该表里的初始化工作发生在函数体&lt;BR&gt;内的任何代码被执行之前。&lt;/P&gt;
&lt;P&gt;&amp;gt; 如果类存在继承关系，派生类必须在其初始化表里调用基类的构造函数。&lt;/P&gt;
&lt;P&gt;&amp;gt; 类的const 常量只能在初始化表里被初始化，因为它不能在函数体内用赋值的方式&lt;BR&gt;来初始化&lt;/P&gt;
&lt;P&gt;&amp;gt; 构造从类层次的最根处开始，在每一层中，首先调用基类的构造函数，然后调用成&lt;BR&gt;员对象的构造函数。析构则严格按照与构造相反的次序执行，该次序是唯一的，否则编&lt;BR&gt;译器将无法自动执行析构过程。&lt;/P&gt;
&lt;P&gt;&amp;gt; 一个有趣的现象是，成员对象初始化的次序完全不受它们在初始化表中次序的影响，&lt;BR&gt;只由成员对象在类中声明的次序决定。这是因为类的声明是唯一的，而类的构造函数可&lt;BR&gt;以有多个，因此会有多个不同次序的初始化表。如果成员对象按照初始化表的次序进行&lt;BR&gt;构造，这将导致析构函数无法得到唯一的逆序。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;gt; 注意不要将检查自赋值的if 语句&lt;BR&gt;if(this == &amp;amp;other)&lt;BR&gt;错写成为&lt;BR&gt;if( *this == other)&lt;/P&gt;
&lt;P&gt;&amp;gt; 如果我们实在不想编写拷贝构造函数和赋值函数，又不允许别人使用编译器生成的&lt;BR&gt;缺省函数，怎么办？偷懒的办法是：只需将拷贝构造函数和赋值函数声明为私有函数，不用编写代码。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;lt;边看边补充&amp;gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/34526.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hATEmATH的网上田园</dc:creator><title>不小心掉进深度拷贝的陷阱</title><link>http://blog.vckbase.com/hatemath/archive/2008/07/21/34462.html</link><pubDate>Mon, 21 Jul 2008 01:44:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2008/07/21/34462.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/34462.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2008/07/21/34462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/34462.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/34462.html</trackback:ping><description>&lt;P&gt;&lt;BR&gt;感言：看书时啥都知道，一旦用起来头脑就不一定那么清楚了。这个陷阱我爬了两天才出来，算是个教训。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;现象：&amp;nbsp;某个绘图函数里，如果用selectfont选择自己创建的字体，就会被killed。有时用到了两个内存dc，只要涉及对memdc的操作，哪怕是改一个前景色也killed。奇怪的是打印所有变量和指针都有效。&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;原因：&amp;nbsp;对象的深度拷贝问题。&lt;BR&gt;&amp;nbsp;&amp;nbsp;由于我没写拷贝构造函数，临时对象创建后按位拷贝加入vector，临时对象被析构时将已经分配的GDI资源（字体，memdc）销毁，但vector中对象关于资源的指针不是NULL。于是执行和字体、memdc有关的操作时程序killed。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;结论：当一个对象内部分配了资源（new的内存，GDI资源等等），就需要定义自己的拷贝构造函数。或者说，只要对象析构时释放了资源，就必须自定义拷贝构造函数。否则代码多了以后，debug的代价会非常高昂。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/34462.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hATEmATH的网上田园</dc:creator><title>像素叠加实现图片的半透明混合</title><link>http://blog.vckbase.com/hatemath/archive/2008/04/29/33456.html</link><pubDate>Tue, 29 Apr 2008 01:28:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2008/04/29/33456.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/33456.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2008/04/29/33456.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/33456.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/33456.html</trackback:ping><description>&lt;P align=justify&gt;&lt;FONT face=Arial size=5&gt;像素叠加实现图片的半透明混合&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;转载请注明原创出处：HateMath的网上田园(&lt;A href="http://blog.vckbase.com/HateMath/"&gt;http://blog.vckbase.com/HateMath/&lt;/A&gt;)&lt;BR&gt;&lt;BR&gt;tag: 半透明&amp;nbsp;混合 alpha&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;半透明的混合效果经常在游戏里看到，效果那叫一个好。有天好奇心起，想琢磨一下这种效果是怎么实现的。可是自己没学过数字图像处理和图形学，于是只好凭直觉猜测了。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;按照生活经验，将两个胶片叠在一起时会有半透明效果，于是设想：从位图A和B中对应位置各取一点Pa、Pb，分别求取Pa和Pb的RGB三个分量，并将对应分量求均值后拼装成一个新的颜色，这样就是透明度为一半的混合效果了。按这个思路试了试，发现运气真好。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;实现RGB拼装的函数很简单，此处仅说明原理，未作优化：&lt;/P&gt;
&lt;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: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;IMG id=Codehighlighter1_0_22_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_22_Open_Text.style.display='none'; Codehighlighter1_0_22_Closed_Image.style.display='inline'; Codehighlighter1_0_22_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_0_22_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_22_Closed_Text.style.display='none'; Codehighlighter1_0_22_Open_Image.style.display='inline'; Codehighlighter1_0_22_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;SPAN id=Codehighlighter1_0_22_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"&gt;/**/&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_0_22_Open_Text&gt;&lt;SPAN style="COLOR: #008000"&gt;/*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;*&amp;nbsp;alpha&amp;nbsp;mix&amp;nbsp;demo&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;inline&amp;nbsp;COLORREF&amp;nbsp;AlphaPixel(UINT&amp;nbsp;alpha,&amp;nbsp;COLORREF&amp;nbsp;clr1,&amp;nbsp;COLORREF&amp;nbsp;clr2)&lt;BR&gt;&lt;IMG id=Codehighlighter1_93_390_Open_Image onclick="this.style.display='none'; Codehighlighter1_93_390_Open_Text.style.display='none'; Codehighlighter1_93_390_Closed_Image.style.display='inline'; Codehighlighter1_93_390_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_93_390_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_93_390_Closed_Text.style.display='none'; Codehighlighter1_93_390_Open_Image.style.display='inline'; Codehighlighter1_93_390_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_93_390_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"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_93_390_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;double&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;k&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;double&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)alpha&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;256.0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;double&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;reverse_k&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1.0&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;-&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;k;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;r&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;BYTE(&amp;nbsp;GetRValue(clr2)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;k&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;GetRValue(clr1)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;reverse_k&amp;nbsp;);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;g&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;BYTE(&amp;nbsp;GetGValue(clr2)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;k&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;GetGValue(clr1)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;reverse_k&amp;nbsp;);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BYTE&amp;nbsp;b&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;BYTE(&amp;nbsp;GetBValue(clr2)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;k&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;GetBValue(clr1)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;reverse_k&amp;nbsp;);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;RGB(r,&amp;nbsp;g,&amp;nbsp;b);&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;细心的读者从上面代码可以发现，随着alpha参数由0-255的变化，混合效果可以实现全透明--不透明的渐变。依据上述函数实现的半透明混合效果截图：&lt;BR&gt;&lt;BR&gt;&lt;IMG style="WIDTH: 689px; HEIGHT: 525px" height=525 alt="" hspace=0 src="/images/vckbase_com/hatemath/alpha_blend_demo.JPG" width=689 align=middle border=0&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;程序源代码(内含demo)下载：&lt;A href="http://blog.vckbase.com/Files/HateMath/test_alpha.rar"&gt;http://blog.vckbase.com/Files/HateMath/test_alpha.rar&lt;/A&gt;&lt;BR&gt;程序在winXp SP2 + VC6.0下通过。&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/33456.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hATEmATH的网上田园</dc:creator><title>私有数据一定安全吗？</title><link>http://blog.vckbase.com/hatemath/archive/2008/04/17/33324.html</link><pubDate>Thu, 17 Apr 2008 02:47:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2008/04/17/33324.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/33324.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2008/04/17/33324.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/33324.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/33324.html</trackback:ping><description>&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C++的访问说明符(public private protected)提供了对类内部数据的访问限制。我以前一直以为将成员说明为private就可以保证其数据不被外界读取和改写，直到现在发现自己误解了。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;且看这个小例子：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;
&lt;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: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"&gt;
&lt;DIV&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;#include&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;iostream&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;std;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;stru_a&lt;BR&gt;&lt;IMG id=Codehighlighter1_56_121_Open_Image onclick="this.style.display='none'; Codehighlighter1_56_121_Open_Text.style.display='none'; Codehighlighter1_56_121_Closed_Image.style.display='inline'; Codehighlighter1_56_121_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_56_121_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_121_Closed_Text.style.display='none'; Codehighlighter1_56_121_Open_Image.style.display='inline'; Codehighlighter1_56_121_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_56_121_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"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_56_121_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;:&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stru_a::stru_a();&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;:&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;m_int;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;long&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;m_long;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;stru_a::stru_a()&lt;BR&gt;&lt;IMG id=Codehighlighter1_142_175_Open_Image onclick="this.style.display='none'; Codehighlighter1_142_175_Open_Text.style.display='none'; Codehighlighter1_142_175_Closed_Image.style.display='inline'; Codehighlighter1_142_175_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_142_175_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_142_175_Closed_Text.style.display='none'; Codehighlighter1_142_175_Open_Image.style.display='inline'; Codehighlighter1_142_175_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_142_175_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"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_142_175_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_int&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;1865&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_long&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;9527&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;main()&lt;BR&gt;&lt;IMG id=Codehighlighter1_189_480_Open_Image onclick="this.style.display='none'; Codehighlighter1_189_480_Open_Text.style.display='none'; Codehighlighter1_189_480_Closed_Image.style.display='inline'; Codehighlighter1_189_480_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_189_480_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_189_480_Closed_Text.style.display='none'; Codehighlighter1_189_480_Open_Image.style.display='inline'; Codehighlighter1_189_480_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_189_480_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"&gt;&lt;IMG src="/Images/dot.gif"&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_189_480_Open_Text&gt;&lt;SPAN style="COLOR: #000000"&gt;{&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stru_a&amp;nbsp;a;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stru_a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;p&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;amp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;a;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;a.m_int&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&amp;nbsp;此路不通&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;m_int=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)p&amp;nbsp;)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;endl;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&amp;nbsp;1.&amp;nbsp;用指针读取&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)p&amp;nbsp;)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;=&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;8888&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&amp;nbsp;2.&amp;nbsp;用指针修改&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;m_int=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)p&amp;nbsp;)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;endl;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;m_long=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;long&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)((&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;char&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;)p&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;+&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;sizeof&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;))&amp;nbsp;)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;lt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&amp;nbsp;endl;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;//&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&amp;nbsp;3.用指针读取&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;BR&gt;&lt;IMG id=Codehighlighter1_483_541_Open_Image onclick="this.style.display='none'; Codehighlighter1_483_541_Open_Text.style.display='none'; Codehighlighter1_483_541_Closed_Image.style.display='inline'; Codehighlighter1_483_541_Closed_Text.style.display='inline';" src="/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top&gt;&lt;IMG id=Codehighlighter1_483_541_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_483_541_Closed_Text.style.display='none'; Codehighlighter1_483_541_Open_Image.style.display='inline'; Codehighlighter1_483_541_Open_Text.style.display='inline';" src="/Images/OutliningIndicators/ContractedBlock.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_483_541_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"&gt;/**/&lt;/SPAN&gt;&lt;SPAN id=Codehighlighter1_483_541_Open_Text&gt;&lt;SPAN style="COLOR: #008000"&gt;/*&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_int=&amp;nbsp;1865&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_int=&amp;nbsp;8888&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_long=&amp;nbsp;9527&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/InBlock.gif" align=top&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;请按任意键继续.&amp;nbsp;.&amp;nbsp;.&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #008000"&gt;*/&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #000000"&gt;&lt;BR&gt;&lt;IMG src="/Images/OutliningIndicators/None.gif" align=top&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;从最后的运行结果可以看出，虽然m_int和m_long都是类的私有成员，但是仍然可以通过指针访问。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;关于其原因，《C++编程思想》上有一段解释的很精辟，摘抄如下：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1. 在一个特定的访问块（被访问说明符限定的一组声明）内，成员变量在内存中是连续存放的；&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 程序运行之前，所有的访问说明都消失了....在程序运行期间，对象变成了一个存储区域，别无他物（HateMath注：即访问控制符只是在编译时起作用，防止程序员误访问不该访问的内容。如果你执意用别的方式访问某个私有成员，C++编译器没法阻止。）。&lt;BR&gt;&lt;BR&gt;（完）&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/33324.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hATEmATH的网上田园</dc:creator><title>强制删除PQMagic合并分区时产生的文件夹</title><link>http://blog.vckbase.com/hatemath/archive/2008/02/26/32777.html</link><pubDate>Tue, 26 Feb 2008 00:47:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2008/02/26/32777.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/32777.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2008/02/26/32777.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/32777.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/32777.html</trackback:ping><description>&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;由于硬盘空间紧张，决定将几个分区合并，挪出整块的剩余空间。用硬盘分区大师PQMagic合并时，软件会提示输入一个文件夹的名称，以将被合并分区的内容放在里面。分区合并完成后，发现文件夹无法正常删除。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;折腾了N久，最终找到的解决方法如下：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;右击文件夹，选择属性。在属性对话框中选择安全选项卡，添加...&amp;#8220;选择用户组&amp;#8221;，高级。。。立即查找，选择administrator ，确定。选择administrator，权限为完全控制，应用到所有子目录。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这样就可以按delete键删除了。&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/32777.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hATEmATH的网上田园</dc:creator><title>(转载)回调函数</title><link>http://blog.vckbase.com/hatemath/archive/2007/12/04/31059.html</link><pubDate>Tue, 04 Dec 2007 02:31:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2007/12/04/31059.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/31059.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2007/12/04/31059.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/31059.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/31059.html</trackback:ping><description>&lt;BR&gt;回调函数人人会用，可不是每个人都可以把它讲明白的，这篇文章就讲的很好。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;转载自：&lt;A href="http://alexclark.itpub.net/index.php"&gt;http://alexclark.itpub.net/index.php&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;调用(calling)机制从汇编时代起已经大量使用：准备一段现成的代码，调用者可以随时跳转至此段代码的起始地址，执行完后再返回跳转时的后续地址。 CPU为此准备了现成的调用指令，调用时可以压栈保护现场，调用结束后从堆栈中弹出现场地址，以便自动返回。借堆栈保护现场真是一项绝妙的发明，它使调用者和被调者可以互不相识，于是才有了后来的函数和构件，使吾辈编程者如此轻松愉快。若评选对人类影响最大之发明，在火与车轮之后，笔者当推压栈调用。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 话虽这样说，此调用机制并非完美。回调函数就是一例。函数之类本是为调用者准备的美餐，其烹制者应对食客了如指掌，但实情并非如此。例如，写一个快速排序函数供他人调用，其中必包含比较大小。麻烦来了：此时并不知要比较的是何类数据--整数、浮点数、字符串？于是只好为每类数据制作一个不同的排序函数。更通行的办法是在函数参数中列一个回调函数地址，并通知调用者：君需自己准备一个比较函数，其中包含两个指针类参数，函数要比较此二指针所指数据之大小，并由函数返回值说明比较结果。排序函数借此调用者提供的函数来比较大小，借指针传递参数，可以全然不管所比较的数据类型。被调用者回头调用调用者的函数（够咬嘴的），故称其为回调（callback）。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 回调函数使程序结构乱了许多。Windows API 函数集中有不少回调函数，尽管有详尽说明，仍使初学者一头雾水。恐怕这也是无奈之举。无论何种事物，能以树形结构单向描述毕竟让人舒服些。如果某家族中孙辈又是某祖辈的祖辈，恐怕无人能理清其中的头绪。但数据处理之复杂往往需要构成网状结构，非简单的客户/服务器关系能穷尽。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows 系统还包含着另一种更为广泛的回调机制，即消息机制。消息本是 Windows 的基本控制手段，乍看与函数调用无关，其实是一种变相的函数调用。发送消息的目的是通知收方运行一段预先准备好的代码，相当于调用一个函数。消息所附带的 WParam 和 LParam 相当于函数的参数，只不过比普通参数更通用一些。应用程序可以主动发送消息，更多情况下是坐等 Windows 发送消息。一旦消息进入所属消息队列，便检感兴趣的那些，跳转去执行相应的消息处理代码。操作系统本是为应用程序服务，由应用程序来调用。而应用程序一旦启动，却要反过来等待操作系统的调用。这分明也是一种回调，或者说是一种广义回调。其实，应用程序之间也可以形成这种回调。假如进程 B 收到进程 A 发来的消息，启动了一段代码，其中又向进程 A 发送消息，这就形成了回调。这种回调比较隐蔽，弄不好会搞成递归调用，若缺少终止条件，将会循环不已，直至把程序搞垮。若是故意编写成此递归调用，并设好终止条件，倒是很有意思。但这种程序结构太隐蔽，除非十分必要，还是不用为好。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 利用消息也可以构成狭义回调。上面所举排序函数一例，可以把回调函数地址换成窗口handle。如此，当需要比较数据大小时，不是去调用回调函数，而是借 API 函数 SendMessage 向指定窗口发送消息。收到消息方负责比较数据大小，把比较结果通过消息本身的返回值传给消息发送方。所实现的功能与回调函数并无不同。当然，此例中改为消息纯属画蛇添脚，反倒把程序搞得很慢。但其他情况下并非总是如此，特别是需要异步调用时，发送消息是一种不错的选择。假如回调函数中包含文件处理之类的低速处理，调用方等不得，需要把同步调用改为异步调用，去启动一个单独的线程，然后马上执行后续代码，其余的事让线程慢慢去做。一个替代办法是借 API 函数PostMessage发送一个异步消息，然后立即执行后续代码。这要比自己搞个线程省事许多，而且更安全。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如今我们是活在一个 object 时代。只要与编程有关，无论何事都离不开 object。但 object 并未消除回调，反而把它发扬光大，弄得到处都是，只不过大都以事件（event）的身份出现，镶嵌在某个结构之中，显得更正统，更容易被人接受。应用程序要使用某个构件，总要先弄清构件的属性、方法和事件，然后给构件属性赋值，在适当的时候调用适当的构件方法，还要给事件编写处理例程，以备构件代码来调用。何谓事件？它不过是一个指向事件例程的地址，与回调函数地址没什么区别。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 不过，此种回调方式比传统回调函数要高明许多。首先，它把让人不太舒服的回调函数变成一种自然而然的处理例程，使编程者顿觉气顺。再者，地址是一个危险的东西，用好了可使程序加速，用不好处处是陷阱，程序随时都会崩溃。现代编程方式总是想法把地址隐藏起来（隐藏比较彻底的如 VB 和 Java），其代价是降低了程序效率。事件例程使编程者无需直接操作地址，但并不会使程序减速。更妙的是，此一改变，本是有损程序结构之奇技怪巧变成一种崭新设计理念，不仅免去被人抨击，而且逼得吾等凡人净手更衣，细细研读，仰慕至今。只是偶然静心思虑，发觉不过一瓶旧酒而已，故引得此番议论，让诸君见笑了。 事件驱动程序设计是围绕着消息基础形成的，发生一个事件，伴随着一大堆的消息。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我理解&amp;#8220;回调机制&amp;#8221;是window 在执行某个API函数的过程中，调用指定的一个函数。我们可以模拟一下：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;假设 ms 提供一个函数叫做&amp;nbsp; EnumFont ,该函数是得到所有的字体，假设它的实现是&lt;BR&gt;EnumFont()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; while ( (f =FindNextFont()) !=NULL)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("fontname: " + f.name);&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;这样就循环显示出所有的字体名称。但是，开发者可能对字体信息另有用处，那么如何才能让开发者能使用这些信息呢，于是做改进：&lt;BR&gt;EnumFont( void*&amp;nbsp; userFunc )&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; while ( (f =FindNextFont()) !=NULL)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("fontname: " + f.name);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( userFunc!=NULL)&amp;nbsp; userFunc( f) ;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;假设userFunc 是一个函数 void f( FontObject font).这样使用者只需要定义一个函数：&lt;BR&gt;&amp;nbsp; void myfunc( FontObject font)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listCtrl.Addstring ( font.name);&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&lt;BR&gt;通过使用 EnumFont ( myfunc) 就可以将所有额字体信息添加到一个列表框中。那么我们称 myfunc是一个回调函数，即让某个系统函数调用的函数。因此可以得出结论：&lt;BR&gt;1 回调函数是由开发者按照一定的原型进行定义的函数&lt;BR&gt;2 回调函数并不由开发者直接调用执行&lt;BR&gt;3 回调函数通常作为参数传递给系统API，由该API来调用。&lt;BR&gt;4 回调函数可能被系统API调用一次，也可能被循环调用多次。&lt;BR&gt;&lt;BR&gt;比如 函数int EnumFontFamilies(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HDC hdc,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;// handle to device control&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPCTSTR lpszFamily,&amp;nbsp; // pointer to family-name string&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FONTENUMPROC lpEnumFontFamProc,&amp;nbsp; // pointer to callback function&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPARAM lParam&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // pointer to application-supplied data&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;BR&gt;其中的&amp;nbsp;&amp;nbsp; FONTENUMPROC lpEnumFontFamProc就是一个回调函数，该函数遵照格式int CALLBACK EnumFontFamProc( ENUMLOGFONT FAR *lpelf,&amp;nbsp; NEWTEXTMETRIC FAR *lpntm, int FontType,&amp;nbsp; LPARAM lParam )进行定义。&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,回调函数提供了一种异步的机制,相对于同步执行,提高了效率.前者的例子如WriteFileEx,ReadFileEx等,函数的最后一个参数是一个回调函数的指针,程序中调用WriteFileEx以后,就直接返回了,可以继续进行其他工作,系统在读写操作完成后通知程序作善后处理.后者的例子就是windows的事件机制回调函数的另一个用途,是用于一些枚举函数,如EnumDisplayModes等,每找到一种支持的显示模式,就通知回调函数,由回调函数具体处理,这是因为 EnumDisplayModes本身并不知道用户要如何处理.能,用户提供回调函数,定制系统的功能,这样,不同的用户提供不同的回调函数,可以使系统具有不同的功能.这就是所谓的plugin.使用回调函数实际上就是在调用某个函数（通常是API函数）时，将自己的一个函数（这个函数为回调函数）的地址作为参数传递给那个函数。而那个函数在需要的时候，利用传递的地址调用回调函数，这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数，跟具体使用的API函数有关，一般在帮助中有说明回调函数的参数和返回值等。&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/31059.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>hATEmATH的网上田园</dc:creator><title> Linux下MiniGUI平台的透明位图的实现方法</title><link>http://blog.vckbase.com/hatemath/archive/2007/11/30/31009.html</link><pubDate>Fri, 30 Nov 2007 08:27:00 GMT</pubDate><guid>http://blog.vckbase.com/hatemath/archive/2007/11/30/31009.html</guid><wfw:comment>http://blog.vckbase.com/hatemath/comments/31009.html</wfw:comment><comments>http://blog.vckbase.com/hatemath/archive/2007/11/30/31009.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blog.vckbase.com/hatemath/comments/commentRss/31009.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/hatemath/services/trackbacks/31009.html</trackback:ping><description>&lt;P align=center&gt;&lt;STRONG&gt;&amp;nbsp;Linux下MiniGUI平台的透明位图的实现方法&lt;BR&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;转载请注明原创出处：HateMath的网上田园(&lt;A href="http://blog.vckbase.com/HateMath/"&gt;http://blog.vckbase.com/HateMath/&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;名词解释：&lt;BR&gt;&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;MiniGUI：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;相对于PC机，嵌入式系统的资源往往很有限，很难用诸如XWindow这类重量级的东东进行图形用户界面的支持。MiniGUI应时而出，为嵌入式操作系统建立了一个快速、稳定和轻量级的图形用户界面支持系统。更多见官网:&lt;A href="http://www.minigui.com"&gt;http://www.minigui.com&lt;/A&gt;&lt;BR&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;为什么需要透明位图？&lt;BR&gt;&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;位图的轮廓都是方形的，可是我们经常需要形状不规则的图，比如要实现一只蝴蝶在草丛间飞舞的效果，用蝴蝶和草丛的位图进行简单叠加肯定是不行的---蝴蝶边上的背景怎么办？&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;BR&gt;解决之道&lt;BR&gt;&lt;BR&gt;&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;在PC传统的GDI环境下，使用位图和掩模异或的方法堪称经典，此类资料实在太多，不在此浪费口水了。这里主要讲讲MiniGUI下更简便的实现方法：SetMemDCColorKey()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetMemDCColorKey()是基于NEWGAL的高级GDI函数，原型如下：&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOOL GUIAPI SetMemDCColorKey ( HDC&amp;nbsp; mem_dc,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The device context&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp; flags,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The color key specific memory DC flags.&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Uint32&amp;nbsp; color_key&amp;nbsp; &amp;nbsp;//The color_key of the memory DC.&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mem_dc是内存设备环境的句柄；&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flag在设置透明色时，取 MEMDC_FLAG_SRCCOLORKEY，要取消透明色设置，可将flags设置为0；&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color_key 是MiniGUI中的颜色变量，代表想要设置为透明的颜色。函数调用成功返回TRUE，失败返回FALSE。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;这个函数用来设置一个内存设备环境中的透明色。在将内存设备环境中的位图BitBlt到目标DC时，MiniGUi会跳过和透明色一样颜色的像素，也就是说，目标DC上对应位置处的像素值不变(不被覆盖)。&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这样说太过于技术化了！HateMath一直认为，&lt;STRONG&gt;技术本身是严谨的，但其表现形式应该是生动有趣的。&lt;/STRONG&gt;我们还是用形象的语言来表述一下吧：想像窗口是一个桌子，内存DC是桌布，没有使用SetMemDCColorKey()之前，BitBlt函数直接将整个桌布蒙在桌子上，而使用了SetMemDCColorKey()指定桌布上某些部分为透明色后，BitBlt会把桌布上的这些地方统统剪个洞，再蒙到桌子上。桌子上对应透明色的位置是不被覆盖的。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这样一来，前面提到的问题就迎刃而解了。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;STRONG&gt;详细的步骤如下&lt;/STRONG&gt;：&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0. 将蝴蝶身体以外的像素都用某一种颜色A(当然是和蝴蝶不一样的颜色)填充&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1. 在窗口DC上画草丛的位图 (用到的GDI函数： FillBoxWithBitmap, &amp;nbsp;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. 创建内存DC，依次在上面画草丛位图和蝴蝶位图 (CreateCompatibleDC, FillBoxWithBitmap)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3. 设置颜色A为内存DC中的透明色，再通过BitBlt把内存DC内容输出到目标DC(一般是窗口的DC)上 (SetMemDCColorKey, BitBlt)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;注意操作完成后要要取消透明色设置，否则程序会崩溃。上面说的是问题的基本思路，具体实现起来时，还可以根据实际情况进行优化。比如用双缓冲防止绘图时闪烁。关于双缓冲绘图可参见我在vckbase在线杂志上的文章：《实例解说双缓冲》 (&lt;A href="http://www.vckbase.com/document/viewdoc/?id=1612"&gt;http://www.vckbase.com/document/viewdoc/?id=1612&lt;/A&gt;)&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;最后想补充一句，如果不是要求必需使用位图，其实还有&lt;STRONG&gt;更简单的方法&lt;/STRONG&gt;实现图片的透明：png图片。当在MiniGUi中加载了png格式的图片时，该透明的地方是透明的(不要用ACDSee3.0编辑png图片)。我原来用的是SetMemDCColorKey，现在改用png的方案，效果也很好。下面是圆角图标示例：&lt;BR&gt;&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG style="WIDTH: 468px; HEIGHT: 91px" height=91 alt="" hspace=0 src="/images/vckbase_com/hatemath/透明位图.JPG" width=468 align=middle border=0&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;(完)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blog.vckbase.com/hatemath/aggbug/31009.html" width = "1" height = "1" /&gt;</description></item></channel></rss>