﻿<?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++博客-单链DNA</title><link>http://www.cppblog.com/Geek/</link><description>换了个地址：http://www.cnblogs.com/vizhen/
</description><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 18:11:51 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 18:11:51 GMT</pubDate><ttl>60</ttl><item><title>【Ubuntu小技巧】经常换主题，可怎么换回来呢？</title><link>http://www.cppblog.com/Geek/archive/2011/06/09/148373.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Thu, 09 Jun 2011 12:35:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/06/09/148373.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/148373.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/06/09/148373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/148373.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/148373.html</trackback:ping><description><![CDATA[<p>其实很容易，在个人的主目标。然后<br>rm -rf&nbsp;&nbsp; .gconf</p> <p>这样就行了,在重新启动,是不是面板都恢复成默认的啦。</p> <p>如果还不行,那就</p> <p>rm -rf .gconfd</p> <p><br>1、不小心误删面板的恢复方式<br>&nbsp; <br>Linux代码&nbsp; 收藏代码</p> <p>&nbsp;&nbsp;&nbsp; gconftool --recursive-unset /apps/panel&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; rm -rf ~/.gconf/apps/panel&nbsp; <br>&nbsp;&nbsp;&nbsp; pkill gnome-panel&nbsp; </p> <p>&nbsp;</p> <p>2、不小心更改默认主题风格的恢复方式<br>Linux代码&nbsp; 收藏代码</p> <p>&nbsp;&nbsp;&nbsp; rm -rf /home/你自己的用户目录/.gconf*&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; sudo reboot now&nbsp; </p><img src ="http://www.cppblog.com/Geek/aggbug/148373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-06-09 20:35 <a href="http://www.cppblog.com/Geek/archive/2011/06/09/148373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Ubuntu小技巧]解决TXT文档中文乱码</title><link>http://www.cppblog.com/Geek/archive/2011/06/09/148371.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Thu, 09 Jun 2011 12:34:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/06/09/148371.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/148371.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/06/09/148371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/148371.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/148371.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 在Ubuntu下，经常双击文件使用默认的gedit打开文件，但是文件编码是gb2312，或者gbk时，中文可能就会是显示为乱码。</p> <p>解决方法：&nbsp;&nbsp;&nbsp; </p> <p>（1）使用gedit的打开菜单，在选择文件的同时，可以有选项选择编码，这样可以保证打开的文件编码正确，正确显示文件中的中文，只对此次有效<br>&nbsp;&nbsp; </p> <p>（2） 如果经常使用gbk的编码，那么就可以通过终端下面执行gconf-editor,然后选在apps下gedit-2下preferences下的encodings下的auto_detected,双击，添加gbk编码，同时gbk编码移动到utf-8的后面，这个细节也很重要。否则有时候还是会检测成其他编码。出现乱码。 <br>&nbsp;&nbsp;&nbsp;&nbsp; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 推荐第二种方法，治本之选。</p><img src ="http://www.cppblog.com/Geek/aggbug/148371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-06-09 20:34 <a href="http://www.cppblog.com/Geek/archive/2011/06/09/148371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不要困在自己建造的盒子里&amp;mdash;&amp;mdash;写给.NET程序员</title><link>http://www.cppblog.com/Geek/archive/2011/02/26/140680.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Sat, 26 Feb 2011 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/02/26/140680.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/140680.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/02/26/140680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/140680.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/140680.html</trackback:ping><description><![CDATA[<p><strong>原文链接：<a href="http://www.cnblogs.com/leoo2sk/archive/2011/02/24/dotnet-box.html">http://www.cnblogs.com/leoo2sk/archive/2011/02/24/dotnet-box.html</a></strong>  <p><strong>此文章的主旨是希望过于专注.NET程序员在做好工作、写好.NET程序的同时，能分拨出一点时间接触一下.NET之外的东西（例如10%-20%的时间），而不是鼓动大家什么都去学最后什么都学不精，更不是说.NET不行或劝大家放弃.NET。恕我愚钝，此主旨在文中表达不够清楚，看评论中很多朋友误解了，特此说明。</strong>  <p><strong>另外，本文中的观点并不全部是我个人的想法，相当一部分来自我以前聊过天的某些大牛，他们很多来自微软、百度、腾讯等知名企业，并且很多已经成为技术骨干，我曾经从他们那里受益匪浅，于是我把他们的指教结合自身的经验和理解写成此文。这就是此文的来源。</strong>  <p>------------------------------------------------------------华丽的分割线------------------------------------------------------------  <p>在给这篇文章起标题的时候，我斟酌了很久，因为我个人是反对使用“.NET程序员”、“C++程序员”或“PHP程序员”这类简单粗暴的方式为程序员做划分的。但是客观确实存在一个现象，就是很多程序员会为自己设置一个无形的界限，将自己与某种语言或平台硬绑定到一起，例如我这里所指的“.NET程序员”。请注意这与“术业有专攻”是不同概念的，有自己专攻的平台或领域这很正常，但是有很多人偏执地将自己与某个语言或平台紧紧捆绑，而忘记了自己首先是一名程序员，然后才使用某种语言，他们偏执于平台并陶醉于自己建立的盒子里，而不愿主动去接触一些盒子外的事物，最终使得自己无法进步。  <p>从我个人的观点看，本文中“.NET程序员”是指具有如下特点的程序员群体：  <ul> <li><strong>学习、工作的技术范围均局限于.NET平台及衍生，对.NET之外的技术没有主动接触或学习的欲望。</strong>  <li><strong>不断学习各种.NET平台上的库或框架，如ADO.NET，ASP.NET MVC，WPF，Silverlight，WCF，WP，EF，NHibernate……</strong>  <li><strong>工作无法脱离Visual Studio，习惯于图形化的工作环境。</strong>  <li><strong>时常抱怨微软的技术更新太快，微软开发平台包办太多以至于自己身价贬值。</strong>  <li><strong>对面向对象、设计模式、软件架构等东西具有极大的热情，宁可花大量时间编造各种“设计模式小故事”也不愿花点时间了解一点新鲜的东西（如Unix下的IPC）。</strong>  <li><strong>对Java颇有微词，觉得C我根本用不到，至于PHP？它能做到的.NET都能做到，认为用Linux的大多在装逼，而Lisp、Lua、Eiffel神马的都是浮云，我管它们干什么。</strong>  <li><strong>认为面向对象语言就是程序设计语言的代名词，命令式编程深入骨髓，不太了解函数式语言或契约式语言是什么。</strong>  <li><strong>用.NET很多年了，但感觉自己没什么突破，没什么进步，成天就搞些增删改查的劳什子。</strong>  <li><strong>经常讨论或思考.NET或Java或C或其它语言哪个好，搞哪个更挣钱这种问题。</strong></li></ul> <p>如果您有超过3项符合上述特征，我想我们可以聊一聊，因为据我的观察，感觉博客园上这类朋友还是挺多的。  <h3>希望我能做到旁观者清</h3> <p>有一个事实我想先和大家澄清一下，其实<strong>.NET只是我的业余爱好</strong>。由于博客园主要偏重于.NET平台，且园子里的朋友对面向对象、架构之类的颇感兴趣，所以我写了很多关于.NET及架构方面的文章（如果您注意观察，会发现我博客里这类文章正减少并趋于消失），其实相对于设计、架构这类东西，我个人更感兴趣的是具体的科学与技术，例如各种编程语言的原理、应用及实现扩展，操作系统原理，网络编程，通信协议，算法与数据结构，数据挖掘，机器学习，分布式等等；语言方面我比较喜欢的是PHP、Python、Lisp等；而编程方面我更推崇Unix下的编程哲学和编程方法；我爱vim胜过VS无数倍。  <p>因此，.NET和C#我一直是作为业余爱好来发展的，希望这没有让任何人觉得沮丧。很多朋友加我QQ或MSN问我关于.NET的问题，我经常答不上来，很多人或许觉得我不近人情，但我其实是真的答不上来。例如我在博客中写过一系列关于ASP.NET MVC的文章，很多人是冲那系列文章加我的，但是其实ASP.NET MVC我只在beta版时摆弄过两个星期，然后就再也没有碰过，所以后来很多朋友问我想关问题我是真的答不上来。  <p>所以，在博客园这个以.NET和架构之类为主的社区，我算是半个旁观者吧，我看到园子里很多朋友都把自己禁锢在自己创造的盒子里，所以我希望以旁观者的身份，给这些朋友提几个建议。  <h3>每半年接触并学习一门语言</h3> <p>有许多人通常觉得只要把一门语言学会学精就行，这个想法我觉得对了一半。<strong>一个程序员应该有一门精通的语言，但是还要不断学习新的语言（当然不能太频繁），倒不是为了以防哪天万一用到这门语言，而是接触学习不同的语言会拓展程序员的视野。</strong>  <p>如果你一直用C#，试试Lisp，你会惊叹于还有这样写程序的方式，嗯？看来我得去学学Lamda演算；试试Python，你会惊讶于还有如此小巧优美的东西；试试Lua，你会发现原来语言还能嵌入其它语言，要不要为WOW写个外挂试试？试试Eiffel，你会发现还有契约式编程这种方法，嗯？什么？Java上有iContract，那我要不要为.NET实现一个？随着这种学习过程，你的思维自然就被拓展开了，而不是满脑子的Class、 Object、MVC、OO……  <p><strong>其实学习语言不一定是学习没听说过的，许多您听到耳朵长茧却从来没有深入学习的“老朋友”</strong>，如C、PHP，如果您细心学下来，也会得到许多意外的收获。  <p>例如在学C的过程中，你会发现不可能脱离Unix环境而把C学好，你会接触POSIX和System V，你会主动深入学习进程、线程、信号、I/O、IPC，你会接触TCP/IP协议。你会发现要学好C还要理解计算机组成原理，你还会发现原来还有大小端这个东西。  <p>深入学习PHP，你会发现PHP远不仅仅是一个做Web的脚本语言那么简单，你会了解到它SAPI、PHP Compiler和Zend Engine的优美结构，你会发现有opcode，你会发现PHP浑身都是扩展点，你可以扩展功能，扩展Compiler和Zend Engine，甚至可以完全实现自己的编译和运行逻辑。你会了解APC是如何缓存opcode，APD是如何跟踪PHP的运行。  <p>每次学习一门语言，你会发现这不是一门语言，而是一个崭新的新大陆，里面有太多让人兴奋和新奇的东西，而如果你执意禁锢在“.NET盒子”里，你就永远不会知道这些。  <h3>主动突破自己 接受更多挑战</h3> <p><strong>如果什么东西都是用到才学，代码都是有用才写，那我只能非常抱歉的说你还不是个程序员，而只是个代码工人。</strong>程序员应该有主动出击的意识，应该对自己未接触的领域有无限向往。幸运的是，互联网上的财富实在太多了，你应该尽其所能去接触学习未知的东西，而不要总想我学习这个东西能不能换来钱给孩子买尿布和奶粉。你可以有很多借口，但是我想说，<strong>借口想找总是有的，时间想找也总是有的，还是看自己到底要什么。</strong>不要一边躺在盒子里一边又抱怨自己没有进步。  <p>例如<a href="http://research.google.com/pubs/papers.html">Google Publication</a>，这里有世界最优秀的Google工程师们理论和实践的总结，来读读这些伟大的论文吧，看看这个伟大的公司和一群伟大的人都干了些什么，了解一下Map Reduce是怎么回事，如果了解了你自然想去试试Hadoop，还有Bigtable和GFS，哦！太震撼了，原来存储数据也有这么多讲究，不是放硬盘里或通过Insert插入数据库就行了。也许这些英文论文读起来很困难，但是我想一周一篇的要求并不高（我现在仍然保持着一周读两篇论文的习惯）。要知道，最新、最严谨的东西都在论文里，如果你只是通过书本或社区学习，那么你永远不会知道今天在计算机科学与技术的领域又发生了哪些令人震撼的事情，出现了哪些新奇的东西。  <p>不要太懒惰，你写增删改查写累了吗？Come on！有没有想过自己写一个小型的httpd？当然你需要先去学习HTTP协议（<a href="http://www.ietf.org/rfc/rfc2612.txt">rfc2612</a>），试试能不能写一个PHP的SAPI扩展令你的httpd处理PHP脚本。有没有想过自己用lex和yacc实现一个自己的小语言，也不是完全没用，也许你已经对你的领域业务逻辑烂熟于胸，那么去实现一个自己的领域语言吧。啊！我要去学习编译原理、形式语言与自动机……咦，这东西还挺有意思的，去看看计算理论去……如果到了这里，你已经开始接触计算机的数学本质了，而你的层次将会得到升华。  <p>学习就是这样，主动突破自己，给自己一些挑战性的任务，生活才有趣。成天困在.NET的盒子里，我们还有脸称自己为程序员吗？  <h3>脱离IDE 玩玩纯文本与shell</h3> <p><strong>从没用过IDE的程序员可能是悲剧，但从没脱离过IDE的程序员绝对是悲剧！</strong>  <p>你有没有觉得自己越来越不像个“编程序”的而越来越像“堆程序”的。好的，即使在工作时你离不开IDE，那么业余时间让你的IDE滚蛋，等等，你改用Notepad？气死我了你！试试<a href="http://www.vim.org/">vim</a>或<a href="http://www.gnu.org/software/emacs/">Emacs</a>，体验一下用纯文本写程序，用gcc编译连接的乐趣。你会发现“yyp”比“选中一行，Ctrl+C，点击下一行起始位置，Ctrl+V”简单的多，你会发现按一下“0”比按20次“左箭头”省事的多。等源程序多了，也许你会想去学习Makefile的写法。你会莫名其妙地发现自己更懂编译和连接过程了。  <p>相信我，用纯文本和shell写程序比用IDE酷多了，想吸引女孩子吗？你去问问你们班或你们公司最漂亮的女生，她也会这么想。重要的是，这种酷不是“装B”的酷，而是有效率的酷。什么？你已经受不了IDE了……  <h3>接受更多的编程哲学与学习方式</h3> <p>注意我是用的“接受”而不是用“改变”，<strong>你不需要改变什么，写.NET程序很好，不过你可以适当吸取一下其它领域的编程哲学与学习方式。</strong>可以说Windows（特别是.NET）程序员和Unix程序员思考问题的方式大不相同，如果现在需要一辆汽车，Windows程序员会建立一个从冶铁到装配的“All in one”汽车制造基地；而Unix程序员会去分别建立采矿场、冶铁厂、设计公司、材料制造厂、机械制造厂和装配厂。我不想讨论他们各自的优缺点（因为很容易陷入无谓的宗教纷争），但是对于你来说，了解一些其它的编程哲学对你没有坏处。  <p>另外就是学习方式，例如你要学习PHP，请千万不要去书店购买各种《21天精通PHP》或《PHP编程宝典》，你应该首先打开Google，找到 PHP官网，然后去官方文档哪里寻找学习资源。网上还有各种wiki，mailing lists和社区，请不要放弃这些资源。然后同时你可以去<a href="http://www.amazon.com/">Amazon</a>看书评，然后小心而谨慎地选择一本相关的书籍（影印版最优，翻译版其次）。  <p>一个人想突破自己不容易，关键在于自己有没有突破的意愿。衷心希望有一天，您的脑中不再被ASP.NET，ASP.NET MVC，WCF，WPF，ADO.NET，Silverlight，EF……而占满，如果到了那一天，你会发现，咦？！我.NET的水平也大幅提升了！</p><img src ="http://www.cppblog.com/Geek/aggbug/140680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-02-26 10:40 <a href="http://www.cppblog.com/Geek/archive/2011/02/26/140680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计算二进制中1的个数</title><link>http://www.cppblog.com/Geek/archive/2011/02/24/140589.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Thu, 24 Feb 2011 08:12:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/02/24/140589.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/140589.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/02/24/140589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/140589.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/140589.html</trackback:ping><description><![CDATA[<p>编写一个函数返回数字的二进制位中‘1’的个数。</p> <p>&nbsp;</p> <p>方法一，递归</p><pre class="code"><span style="color: blue">int </span><span style="background: white; color: #010001">findOneinBin</span>(<span style="color: blue">int </span><span style="background: white; color: #010001">n</span>)
{
   <span style="color: blue">if</span>(<span style="background: white; color: #010001">n</span>&lt;2)
      <span style="color: blue">return </span>1;
  <span style="color: blue">else return </span><span style="background: white; color: #010001">n</span>%2+<span style="background: white; color: #010001">findOneinBin</span>(<span style="background: white; color: #010001">n</span>/2);
}</pre>
<p>这个方法很容易想到，如果是奇数的话就是他的n/2+1，也就是有一位加上1个1.</p>
<p>方法二，google一下找出来的，没看懂</p><pre class="code"><span style="color: blue">#define </span><span style="background: white; color: #010001">POW</span>(<span style="background: white; color: #010001">c</span>) (1&lt;&lt;(<span style="background: white; color: #010001">c</span>))
<span style="color: blue">#define </span><span style="background: white; color: #010001">MASK</span>(<span style="background: white; color: #010001">c</span>) (((<span style="color: blue">unsigned long</span>)-1) / (<span style="background: white; color: #010001">POW</span>(<span style="background: white; color: #010001">POW</span>(<span style="background: white; color: #010001">c</span>)) + 1))
<span style="color: blue">#define </span><span style="background: white; color: #010001">ROUND</span>(<span style="background: white; color: #010001">n</span>, <span style="background: white; color: #010001">c</span>) (((<span style="background: white; color: #010001">n</span>) &amp; <span style="background: white; color: #010001">MASK</span>(<span style="background: white; color: #010001">c</span>)) + ((<span style="background: white; color: #010001">n</span>) &gt;&gt; <span style="background: white; color: #010001">POW</span>(<span style="background: white; color: #010001">c</span>) &amp; <span style="background: white; color: #010001">MASK</span>(<span style="background: white; color: #010001">c</span>)))

<span style="color: blue">int </span><span style="background: white; color: #010001">bit_count</span>(<span style="color: blue">unsigned int </span><span style="background: white; color: #010001">n</span>)
{
    <span style="background: white; color: #010001">n</span> = <span style="background: white; color: #010001">ROUND</span>(<span style="background: white; color: #010001">n</span>, 0);
    <span style="background: white; color: #010001">n</span> = <span style="background: white; color: #010001">ROUND</span>(<span style="background: white; color: #010001">n</span>, 1);
    <span style="background: white; color: #010001">n</span> = <span style="background: white; color: #010001">ROUND</span>(<span style="background: white; color: #010001">n</span>, 2);
    <span style="background: white; color: #010001">n</span> = <span style="background: white; color: #010001">ROUND</span>(<span style="background: white; color: #010001">n</span>, 3);
    <span style="background: white; color: #010001">n</span> = <span style="background: white; color: #010001">ROUND</span>(<span style="background: white; color: #010001">n</span>, 4);
    <span style="color: blue">return </span><span style="background: white; color: #010001">n</span>;
}</pre>
<p>一下子看不明白，先把宏展开来：<br>POW是计算2的幂<br>MASK很奇怪，一个全1的无符号数字除以2的幂的幂加1？<br>好在打印出来还能看得懂： 
<p><img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif">MASK(0) = 55555555 h = 01010101010101010101010101010101 b<br><img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif">MASK(1) = 33333333 h = 00110011001100110011001100110011 b<br><img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif">MASK(2) = 0f0f0f0f h = 00001111000011110000111100001111 b<br><img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif">MASK(3) = 00ff00ff h = 00000000111111110000000011111111 b<br><img align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif">MASK(4) = 0000ffff h = 00000000000000001111111111111111 b 
<p>这些mask分别把32位数字划分为几个部分。每个部分的前一半和后一半分别是全'0'和全'1'。<br>MASK(0)分为16个部分，MASK(1)分为8个部分，...<br>ROUND中对n的处理：(n &amp; MASK) + (n &gt;&gt; POW &amp; MASK)<br>POW的值刚好是MASK中连续'0'(或者连续'1')的长度。也就是说ROUND把由MASK分开的n的各个部分中的高POW位和低POW位相加。<br>为了便于说明，取一个简单的部分：MASK(1)的0011<br>假设n的值为1001，那么ROUND后的结果就是10 + 01 = 11 b，把这个结果赋值给n，这时n的含义由原来的二进制位串变为'1'位的数量。特别的，当ROUND(n, 0)时，把n当作一个32个部分各自'1'位的数量。（'0'表示没有'1'，而'1'则表示有1个'1'）<br>计算完n = ROUND(n, 0)后，n是一个16个部分各自'1'位数量的'数组'，这个'数组'的每个元素只有2个二进制位。最大值为2，足够由2个二进制位来表示。<br>接下来，计算完n=ROUND(n,1)后，n是一个8个部分各自'1'位数量的'数组'，这个'数组'的每个元素只有4个二进制位。最大值为4，足够由4个二进制位来表示。（实际只需要3个二进制位）<br>...<br>最后一步，计算n=ROUND(n,4)后，n是一个1个部分各自'1'位数量的'数组'，这个'数组'的每个元素有32个二进制位。最大值为32，足够由32个二进制位来表示。（实际只需要6个二进制位）<br>这个代表32位内'1'位数量的32位二进制数也就是我们要求的结果。 
<img src ="http://www.cppblog.com/Geek/aggbug/140589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-02-24 16:12 <a href="http://www.cppblog.com/Geek/archive/2011/02/24/140589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>仓央嘉措</title><link>http://www.cppblog.com/Geek/archive/2011/02/19/140319.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Sat, 19 Feb 2011 15:46:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/02/19/140319.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/140319.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/02/19/140319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/140319.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/140319.html</trackback:ping><description><![CDATA[<p>声明:我神马都不知道，纯粹是ctrl+c和ctrl+v.</p> <p>一</p> <p><b>第一最好不相见，如此便可不相恋。<br>第二最好不相知，如此便可不相思。<br>第三最好不相伴，如此便可不相欠。<br>第四最好不相惜，如此便可不相忆。<br>第五最好不相爱，如此便可不相弃。<br>第六最好不相对，如此便可不相会。<br>第七最好不相误，如此便可不相负。<br>第八最好不相许，如此便可不相续。<br>第九最好不相依，如此便可不相偎。<br>第十最好不相遇，如此便可不相聚。<br>但曾相见便相知，相见何如不见时。<br>安得与君相诀绝，免教生死作相思。</b></p> <p><strong></strong>&nbsp;</p> <p><strong>二</strong></p> <p><b>你见，或者不见我<br>我就在那里<br>不悲不喜<br>你念，或者不念我<br>情就在那里<br>不来不去<br>你爱，或者不爱我<br>爱就在那里<br>不增不减 <br>你跟，或者不跟我<br>我的手就在你手里<br>不舍不弃<br>来我的怀里<br>或者<br>让我住进你的心里<br>默然　相爱<br>寂静　欢喜</b></p> <p><strong></strong>&nbsp;</p> <p><strong>三</strong></p> <p><b>住进布达拉宫，<br>我是雪域最大的王。<br>流浪在拉萨街头，<br>我是世间最美的情郎。 <br>我问佛：为何不给所有女子羞花闭月的容颜？<br>佛曰：那只是昙花的一现，用来蒙蔽世俗的眼<br>我问佛：世间为何有那么多遗憾？<br>佛曰：这是一个婆娑世界，婆娑即遗憾<br>我问佛：如何让人们的心不再感到孤单？<br>佛曰：每一颗心生来就是孤单而残缺的<br>我问佛：如果遇到了可以爱的人，却又怕不能把握该怎么办？<br>佛曰：留人间多少爱，迎浮世千重变<br>我问佛：如何才能如你般睿智？<br>佛曰：佛是过来人，人是未来佛<br>我问佛：为什么总是在我悲伤的时候下雪<br>佛说：冬天就要过去，留点记忆<br>我问佛:为什么每次下雪都是我不在意的夜晚<br>佛说:不经意的时候人们总会错过很多真正的美丽<br>我问佛:那过几天还下不下雪<br>佛说:不要只盯着这个季节，错过了今冬</b></p><img src ="http://www.cppblog.com/Geek/aggbug/140319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-02-19 23:46 <a href="http://www.cppblog.com/Geek/archive/2011/02/19/140319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>结构体与类、联合体的区别</title><link>http://www.cppblog.com/Geek/archive/2011/02/15/140120.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Tue, 15 Feb 2011 15:04:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/02/15/140120.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/140120.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/02/15/140120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/140120.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/140120.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp; *在C++中结构体和类有很多相似性，结构体是一种用关键字struct声明的自定义数据类型。与类相似，也可以包含构造函数，常数，字段，方法，属性，索引器，运算符和嵌套类型等，不过，结构是值类型。</p> <p>&nbsp;&nbsp;&nbsp; 结构体还是有很多的区别。</p> <p>&nbsp;&nbsp;&nbsp; 1.类成员默认访问权限为私有（private），结构体成员默认访问权限为公共（public）；</p> <p>&nbsp;&nbsp;&nbsp; 2.从class继承默认是private继承，而从struct继承默认是public继承。</p> <p>注意：C中的struct跟C++中struct可是不一样的</p> <p>*共用体 构造数据类型,也叫联合体 <br>用途：使几个不同类型的变量共占一段内存(相互覆盖) <br>结构体是一种构造数据类型 <br>用途：把不同类型的数据组合成一个整体-------自定义数据类型 <br>--------------------------------------------------------------- <br>结构体变量所占内存长度是各成员占的内存长度的总和。 <br>共同体变量所占内存长度是各最长的成员占的内存长度。 <br>共同体每次只能存放哪个的一种！！ <br>共同体变量中起作用的成员是尊后一次存放的成员， <br>在存入新的成员后原有的成员失去了作用！ <br>--------------------------------------------------------------- <br>struct 与 union主要有以下区别: <br>1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。在struct中，各成员都占有自己的内存空间，它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中，所有成员不能同时占用它的内存空间，它们不能同时存在。Union变量的长度等于最长的成员的长度。 <br>2. 对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的。 </p><img src ="http://www.cppblog.com/Geek/aggbug/140120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-02-15 23:04 <a href="http://www.cppblog.com/Geek/archive/2011/02/15/140120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>引用和指针的区别</title><link>http://www.cppblog.com/Geek/archive/2011/02/15/140116.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Tue, 15 Feb 2011 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/02/15/140116.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/140116.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/02/15/140116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/140116.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/140116.html</trackback:ping><description><![CDATA[<h1>&nbsp;<font size="2"><font style="font-weight: normal">嘎嘎，第一次面试时，笔试的一道题目，我没有答完整。</font></font></h1> <p>引用：就是变量或对象的别名，它不是值，不占存储空间，其只有声明没有定义，其主要用于函数的形参和函数的返回值。</p> <p>注意：引用作为函数的返回值，大多数情况下可以被指针代替，但是遇到构造函数和操作符重载函数的“形式自然”的问题是，是不能被替代的。</p> <p><font color="#4bacc6">引用和指针区别：</font></p> <ol> <li>引用必须初始化，但是不分配存储空间。指针不声明时初始化，在初始化的时候需要分配存储空间。  <li>引用初始化以后不能被改变，指针可以改变所指的对象。  <li>不存在指向空值的引用，但是存在指向空值的指针。</li></ol><img src ="http://www.cppblog.com/Geek/aggbug/140116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-02-15 21:55 <a href="http://www.cppblog.com/Geek/archive/2011/02/15/140116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析C++中内存分配方式</title><link>http://www.cppblog.com/Geek/archive/2011/02/11/139877.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Thu, 10 Feb 2011 16:22:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/02/11/139877.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/139877.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/02/11/139877.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/139877.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/139877.html</trackback:ping><description><![CDATA[<p>&nbsp; <font size="2" face="微软雅黑">在C++中，内存分为<font color="#4bacc6">5大存储区</font>：<font color="#4f81bd">堆区、栈区、全局区、文字常量区、程序代码区</font>。</font></p> <p><font size="2" face="微软雅黑"></font>&nbsp;</p> <table border="0" cellspacing="0" cellpadding="2" width="497"> <tbody> <tr> <td valign="top" width="120"><font size="2" face="微软雅黑">内存区域</font></td> <td valign="top" width="375"><font size="2" face="微软雅黑">说明</font></td></tr> <tr> <td valign="top" width="120"><font size="2" face="微软雅黑">栈区（stack）</font></td> <td valign="top" width="375"><font size="2" face="微软雅黑">&nbsp;&nbsp; 由编译器自动分配释放，存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。</font></td></tr> <tr> <td valign="top" width="120"><font size="2" face="微软雅黑">堆区（heap）</font></td> <td valign="top" width="375"><font size="2" face="微软雅黑">&nbsp; 一般有程序员分配释放，若程序员不释放，程序结束时可能有系统回收。分配方式类似于链表。</font></td></tr> <tr> <td valign="top" width="120"><font size="2" face="微软雅黑">全局区（static）</font></td> <td valign="top" width="375"><font size="2" face="微软雅黑">存放全局变量、静态数据、常量。程序结束后有系统释放。</font></td></tr> <tr> <td valign="top" width="120"><font size="2" face="微软雅黑">文字常量区</font></td> <td valign="top" width="375"><font size="2" face="微软雅黑">&nbsp; 常量字符串就是放在这里；程序结束后有系统释放。</font></td></tr> <tr> <td valign="top" width="120"><font size="2" face="微软雅黑">程序代码区</font></td> <td valign="top" width="375"><font size="2" face="微软雅黑">&nbsp; 存放函数体（类成员函数和全局函数）的二进制代码。</font></td></tr></tbody></table> <p><font size="2" face="微软雅黑">实例分析：</font></p><pre class="code"><p><span style="color: blue">int </span><span style="color: #010001">a</span>=0;            <span style="color: green">//全局区初始化区
</span><span style="color: blue">char </span>*<span style="color: #010001">p1</span>;&nbsp;&nbsp;&nbsp; <span style="color: green">//全局区未初始化区
</span><span style="color: blue">static char </span><span style="color: #010001">b</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green">//全局区未初始化静态变量

</span><span style="color: blue">int </span><span style="color: #010001">main</span>()
{
    <span style="color: blue">int </span><span style="color: #010001">c</span>;                     <span style="color: green">//栈区临时变量
    </span><span style="color: blue">char </span><span style="color: #010001">s</span>[]=<span style="color: #a31515">"abc"</span>;            <span style="color: green">//栈区临时数组变量
    </span><span style="color: blue">char </span>*<span style="color: #010001">p2</span>;                  <span style="color: green">//栈区临时指针变量
    </span><span style="color: blue">char </span>*<span style="color: #010001">p3</span>=<span style="color: #a31515">"123"</span>;&nbsp;&nbsp;&nbsp; <span style="color: green">//常量区常量，栈区指针变量
    </span><span style="color: blue">static int </span><span style="color: #010001">d</span>=0;            <span style="color: green">//全局初始化区静态变量
    </span><span style="color: #010001">p1</span>=<span style="color: blue">new char</span>[10];           <span style="color: green">//堆区分配10个字符空间
    </span><span style="color: #010001">p2</span>=<span style="color: blue">new char</span>[20];           <span style="color: green">//堆区分配20个字符空间
    </span><span style="color: #010001">strcpy</span>(<span style="color: #010001">p1</span>,<span style="color: #a31515">"123"</span>);          <span style="color: green">//"123"放在常量区，编译器有可能将它与p3所指向的区域相同</span></p><p><span style="color: green"></span>}</p></pre>
<p><font size="2" face="微软雅黑"><font color="#4f81bd">内存分配方式</font>：</font></p>
<li><font size="2" face="微软雅黑">从静态存储区分配<br><br>内存在程序编译时就已经分配好，这块内存在程序的整个运行期间都存在。速度快、不容易出错，因为系统会善后。例如全局变量，static常量。</font> 
<li><font size="2" face="微软雅黑">从栈上分配<br><br>在执行函数时，函数内部局部变量的存储单元都在栈上创建，函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中，效率很高，但分配的内存容量有限。</font> 
<li><font size="2" face="微软雅黑">从堆上分配<br><br>也叫动态分配。程序在运行时用malloc或new申请任意大小的内存，程序员自己负责在何时用free或delete释放内存。动态内存的生存期有程序员决定，使用灵活。如果在堆上分配了空间，就有责任回收它，否则运行的程序会出现内存泄露，另外频繁的分配和释放不同大小的堆空间将会产生对内碎块。</font> 
<p><font size="2" face="微软雅黑"></font>&nbsp;</p>
<p><font size="2" face="微软雅黑"><font color="#4f81bd">堆和栈究区别</font>：</font></p>
<p><font size="2" face="微软雅黑">主要的区别由以下几点：<br>&nbsp;&nbsp; 1.管理方式：对于栈来讲，是由编译器自动管理，无需我们手工控制；对于堆来说，释放工作由程序员控制，容易产生memory leak。<br></font></p>
<p><font size="2" face="微软雅黑">&nbsp;&nbsp; 2.空间大小：一般来讲在32位系统下，堆内存可以达到4G的空间，从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲，一般都是有一定的空间大小 的，例如，在VC6下面，默认的栈空间大小是1M（好像是，记不清楚了）。当然，我们可以修改：<br>打开工程，依次操作菜单如下：Project-&gt;Setting-&gt;Link，在Category 中选中Output，然后在Reserve中设定堆栈的最大值和commit。<br>&nbsp;&nbsp;&nbsp; 注意：reserve最小值为4Byte；commit是保留在虚拟内存的页文件里面，它设置的较大会使栈开辟较大的值，可能增加内存的开销和启动时间。<br>&nbsp;&nbsp; </font></p>
<p><font size="2" face="微软雅黑">&nbsp;&nbsp; 3.碎片问题：对于堆来讲，频繁的new/delete势必会造成内存空间的不连续，从而造成大量的碎片，使程序效率降低。对于栈来讲，则不会存在这个问题， 因为栈是先进后出的队列，他们是如此的一一对应，以至于永远都不可能有一个内存块从栈中间弹出，在他弹出之前，在他上面的后进的栈内容已经被弹出，详细的 可以参考数据结构，这里我们就不再一一讨论了。<br>&nbsp;</font></p>
<p><font size="2" face="微软雅黑">&nbsp;&nbsp; 4.生长方向：对于堆来讲，生长方向是向上的，也就是向着内存地址增加的方向；对于栈来讲，它的生长方向是向下的，是向着内存地址减小的方向增长。<br>分配方式：堆都是动态分配的，没有静态分配的堆。栈有2种分配方式：静态分配和动态分配。静态分配是编译器完成的，比如局部变量的分配。动态分配由 alloca函数进行分配，但是栈的动态分配和堆是不同的，他的动态分配是由编译器进行释放，无需我们手工实现。<br></font></p>
<p><font size="2" face="微软雅黑">&nbsp;&nbsp;&nbsp; 5.分配效率：栈是机器系统提供的数据结构，计算机会在底层对栈提供支持：分配专门的寄存器存放栈的地址，压栈出栈都有专门的指令执行，这就决定了栈的效率比 较高。堆则是C/C++函数库提供的，它的机制是很复杂的，例如为了分配一块内存，库函数会按照一定的算法（具体的算法可以参考数据结构/操作系统）在堆内存中搜索可用的足够大小的空间，如果没有足够大小的空间（可能是由于内存碎片太多），就有可能调用系统功能去增加程序数据段的内存空间，这样就有机会分 到足够大小的内存，然后进行返回。显然，堆的效率比栈要低得多。</font></p>
<p><font color="#4f81bd" size="2" face="微软雅黑">常见的内存错误及其对策：</font></p>
<p>发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误，通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状，时隐时现，增加了改错的难度。常见的内存错误及其对策如下： 
<p>　<font color="#4f81bd">　</font><font color="#c0504d">* 内存分配未成功，却使用了它。</font> 
<p>　　编程新手常犯这种错误，因为他们没有意识到内存分配会不成功。常用解决办法是，在使用内存之前检查指针是否为NULL。如果指针p是函数的参数，那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存，应该用if(p==NULL) 或if(p!=NULL)进行防错处理。 
<p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#9bbb59"></font><font color="#c0504d">* 内存分配虽然成功，但是尚未初始化就引用它。</font> 
<p>　　犯这种错误主要有两个起因：一是没有初始化的观念；二是误以为内存的缺省初值全为零，导致引用初值错误（例如数组）。 内存的缺省初值究竟是什么并没有统一的标准，尽管有些时候为零值，我们宁可信其无不可信其有。所以无论用何种方式创建数组，都别忘了赋初值，即便是赋零值也不可省略，不要嫌麻烦。 
<p>　　<font color="#c0504d">* 内存分配成功并且已经初始化，但操作越过了内存的边界。</font> 
<p>　　例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中，循环次数很容易搞错，导致数组操作越界。 
<p>　　<font color="#c0504d">* 忘记了释放内存，造成内存泄露。</font> 
<p>　　含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足，你看不到错误。终有一次程序突然死掉，系统出现提示：内存耗尽。 
<p>　　动态内存的申请与释放必须配对，程序中malloc与free的使用次数一定要相同，否则肯定有错误（new/delete同理）。 
<p>　　<font color="#c0504d">* 释放了内存却继续使用它。</font> 
<p>　　有三种情况： 
<p>　　（1）程序中的对象调用关系过于复杂，实在难以搞清楚某个对象究竟是否已经释放了内存，此时应该重新设计数据结构，从根本上解决对象管理的混乱局面。 
<p>　　（2）函数的return语句写错了，注意不要返回指向“栈内存”的“指针”或者“引用”，因为该内存在函数体结束时被自动销毁。 
<p>　　（3）使用free或delete释放了内存后，没有将指针设置为NULL。导致产生“野指针”。 
<p>&nbsp;&nbsp;&nbsp; 【规则1】用malloc或new申请内存之后，应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 
<p>&nbsp;&nbsp; 【规则3】避免数组或指针的下标越界，特别要当心发生“多1”或者“少1”操作。 
<p>&nbsp;&nbsp;&nbsp; 【规则4】动态内存的申请与释放必须配对，防止内存泄漏。 
<p>　　【规则5】用free或delete释放了内存之后，立即将指针设置为NULL，防止产生“野指针”。 
</li><img src ="http://www.cppblog.com/Geek/aggbug/139877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-02-11 00:22 <a href="http://www.cppblog.com/Geek/archive/2011/02/11/139877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数指针</title><link>http://www.cppblog.com/Geek/archive/2011/02/09/139834.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Wed, 09 Feb 2011 05:54:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/02/09/139834.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/139834.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/02/09/139834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/139834.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/139834.html</trackback:ping><description><![CDATA[<h6></h6> <p>&nbsp;&nbsp;&nbsp; 来自：百度百科  <p>&nbsp;&nbsp;&nbsp; 函数指针是指向函数的指针<a href="http://baike.baidu.com/view/296689.htm">变量</a>。 因而“函数指针”本身首先应是<a href="http://baike.baidu.com/view/379211.htm">指针变量</a>，只不过该指针变量指向函数。这正如用指针变量可指向<a href="http://baike.baidu.com/view/762381.htm">整型变量</a>、字符型、<a href="http://baike.baidu.com/view/209670.htm">数组</a>一样，这里是指向函数。如前所述，C在编译时，每一个函数都有一个入口地址，该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后，可用该指针变量调用函数，就如同用指针变量可引用其他类型变量一样，在这些概念上是一致的。函数指针有两个用途：调用函数和做函数的<a href="http://baike.baidu.com/view/327406.htm">参数</a>。  <p>&nbsp; <p><font size="4">&nbsp; 1. 函数指针声明方法：</font></p> <p>【数据类型】【*】【指针变量名】（形参列表）；  <p>&nbsp; 注1：“函数类型”说明函数的返回类型，由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少，后面的“形参列表”表示指针变量指向的函数所带的<a href="http://baike.baidu.com/view/327406.htm">参数</a>列表。例如：  <p>&nbsp;&nbsp;&nbsp; int func(int x); /* 声明一个函数 */  <p>　　int (*f) (int x); /* 声明一个函数指针 */  <p>　　f=func; /* 将func函数的首地址赋给指针f */  <p>　　赋值时函数func不带括号，也不带参数，由于func代表函数的首地址，因此经过赋值以后，指针f就指向函数func(x)的代码的首地址。  <p>&nbsp; 注2：函数括号中的形参可有可无，视情况而定。  <p>　　下面的程序说明了函数指针调用函数的方法： </p><pre class="code"><span style="color: blue">#include </span><span style="color: #a31515">&lt;iostream&gt;
</span><span style="color: blue">using namespace </span><span style="color: #010001">std</span>;
<span style="color: blue">int </span><span style="color: #010001">max</span>(<span style="color: blue">int </span><span style="color: #010001">x</span>,<span style="color: blue">int </span><span style="color: #010001">y</span>){<span style="color: blue">return </span>(<span style="color: #010001">x</span>&gt;<span style="color: #010001">y</span>?<span style="color: #010001">x</span>:<span style="color: #010001">y</span>);}
<span style="color: blue">int </span><span style="color: #010001">main</span>()
{
    <span style="color: blue">int </span>(*<span style="color: #010001">ptr</span>)(<span style="color: blue">int</span>,<span style="color: blue">int </span>);
    <span style="color: blue">int </span><span style="color: #010001">a</span>,<span style="color: #010001">b</span>,<span style="color: #010001">c</span>;
    <span style="color: #010001">ptr</span>=<span style="color: #010001">max</span>;
    <span style="color: #010001">cin</span>&gt;&gt;<span style="color: #010001">a</span>&gt;&gt;<span style="color: #010001">b</span>;
    <span style="color: #010001">c</span>=(*<span style="color: #010001">ptr</span>)(<span style="color: #010001">a</span>,<span style="color: #010001">b</span>);
    <span style="color: #010001">cout</span>&lt;&lt;<span style="color: #010001">c</span>&lt;&lt;<span style="color: #010001">endl</span>;
    <span style="color: blue">return </span>0;
}</pre>
<p>&nbsp;&nbsp;&nbsp; ptr是指向函数的指针变量，所以可把函数max()赋给ptr作为ptr的值，即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数，实际上ptr和max都指向同一个入口地址，不同就是ptr是一个指针变量，不像函数名称那样是死的，它可以指向任何函数，就看你想怎么做了。在程序中把哪个函数的地址赋给它，它就指向哪个函数。而后用指针变量调用它，因此可以先后指向不同的函数。<b>不过注意，指向函数的指针变量没有++和--运算，用时要小心</b>。 </p>
<p><font size="4">2.指针函数和函数指针的区别：</font></p>
<p>1,这两个概念都是简称，指针函数是指带指针的函数，即本质是一个函数。我们知道函数都又有返回类型（如果不<a href="http://baike.baidu.com/view/1289389.htm">返回值</a>，则为无值型），只不过指针函数返回类型是某一类型的指针。 
<p>　　其定义格式如下所示： 
<p>　　【返回类型<a href="http://baike.baidu.com/view/390932.htm">标识符</a>】【 *】【返回名称】（形式参数表） 
<p>　　{ <a href="http://baike.baidu.com/view/1377635.htm">函数体</a> } 
<p>　　返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事<b>实上，每一个函数，即使它不带有返回某种类型的指针，它本身都有一个入口地址，该地址相当于一个指针。</b>比如函数返回一个整型值，实际上也相当于返回一个指针变量的值，不过这时的变量是函数本身而已，而整个函数相当于一个“变量”。 
<h4><font size="4">3.关于函数指针数组的定义</font></h4>
<p>关于函数指针数组的定义方法，有两种：一种是标准的方法；一种是蒙骗法。 
<p>　　第一种，标准方法： 
<p>　 函数指针数组是一个其元素是函数指针的数组。那么也就是说，此<a href="http://baike.baidu.com/view/9900.htm">数据结构</a>是一个数组，且其元素是一个指向函数入口地址的指针。 
<p>　　根据分析：首先说明是一个数组：数组名[] 
<p>　　其次，要说明其元素的数据类型指针:*数组名[]. 
<p>　　再次，要明确这每一个数组元素是指向函数入口地址的指针：函数返回值类型 (*数组名[])().请注意，这里为什么要把“*数组名[]”用括号扩起来呢？因为圆括号和数组说明符的优先级是等同的，如果不用圆括号把指针数组说明<a href="http://baike.baidu.com/view/420676.htm">表达式</a>扩起来，根据圆括号和方括号的结合方向，那么 *数组名[]() 说明的是什么呢？是元素返回值类型为指针的函数数组。有这样的函数数祖吗？不知道。所以必须括起来，以保证数组的每一个元素是指针。 
<p>　　第二种，蒙骗法： 
<p>　　尽管函数不是变量，但它在内存中仍有其物理地址，该地址能够赋给指针变量。获取函数地址的方法是：用不带有括号和参数的函数名得到。 
<p>　　函数名相当于一个指向其函数入口<a href="http://baike.baidu.com/view/4523030.htm">指针常量</a>。 那么既然函数名是一个指针常量，那么就可以对其进行一些相应的处理，如<a href="http://baike.baidu.com/view/2886403.htm">强制类型转换</a>。 
<p>　　那么我们就可以把这个地址放在一个整形指针数组中，然后作为函数指针调用即可。 
<p>　　完整例子： </p><pre class="code"><span style="color: blue">#include </span><span style="color: #a31515">&lt;iostream&gt;
</span><span style="color: blue">int </span><span style="color: #010001">add1</span>(<span style="color: blue">int </span><span style="color: #010001">a1</span>,<span style="color: blue">int </span><span style="color: #010001">b1</span>);
<span style="color: blue">int </span><span style="color: #010001">add2</span>(<span style="color: blue">int </span><span style="color: #010001">a2</span>,<span style="color: blue">int </span><span style="color: #010001">b2</span>);

<span style="color: blue">int </span><span style="color: #010001">main</span>()
{
    <span style="color: blue">int </span><span style="color: #010001">numa1</span>=1,<span style="color: #010001">numb1</span>=2;
    <span style="color: blue">int </span><span style="color: #010001">numa2</span>=2,<span style="color: #010001">numb2</span>=3;
    <span style="color: blue">int </span>(*<span style="color: #010001">op</span>[2])(<span style="color: blue">int </span><span style="color: #010001">a</span>,<span style="color: blue">int </span><span style="color: #010001">b</span>);
    <span style="color: #010001">op</span>[0]=<span style="color: #010001">add1</span>;
    <span style="color: #010001">op</span>[1]=<span style="color: #010001">add2</span>;
    <span style="color: #010001">printf</span>(<span style="color: #a31515">"%d ,%d\n"</span>,<span style="color: #010001">op</span>[0](<span style="color: #010001">numa1</span>,<span style="color: #010001">numb1</span>),<span style="color: #010001">op</span>[1](<span style="color: #010001">numa2</span>,<span style="color: #010001">numb2</span>));

    <span style="color: #010001">system</span>(<span style="color: #a31515">"PAUSE"</span>);
    <span style="color: blue">return </span>0;
}

<span style="color: blue">int </span><span style="color: #010001">add1</span>(<span style="color: blue">int </span><span style="color: #010001">a1</span>,<span style="color: blue">int </span><span style="color: #010001">b1</span>)
{
    <span style="color: blue">return </span><span style="color: #010001">a1</span>+<span style="color: #010001">b1</span>;
}
<span style="color: blue">int </span><span style="color: #010001">add2</span>(<span style="color: blue">int </span><span style="color: #010001">a2</span>,<span style="color: blue">int </span><span style="color: #010001">b2</span>)
{
    <span style="color: blue">return </span><span style="color: #010001">a2</span>+<span style="color: #010001">b2</span>;
}
</pre><img src ="http://www.cppblog.com/Geek/aggbug/139834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-02-09 13:54 <a href="http://www.cppblog.com/Geek/archive/2011/02/09/139834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一道题目</title><link>http://www.cppblog.com/Geek/archive/2011/02/07/139771.html</link><dc:creator>Geek.tan</dc:creator><author>Geek.tan</author><pubDate>Sun, 06 Feb 2011 16:04:00 GMT</pubDate><guid>http://www.cppblog.com/Geek/archive/2011/02/07/139771.html</guid><wfw:comment>http://www.cppblog.com/Geek/comments/139771.html</wfw:comment><comments>http://www.cppblog.com/Geek/archive/2011/02/07/139771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Geek/comments/commentRss/139771.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Geek/services/trackbacks/139771.html</trackback:ping><description><![CDATA[<p>题目：写出以下代码输出。</p><pre class="code"><span style="color: blue">#include</span><span style="color: #a31515">&lt;iostream&gt;
</span><span style="color: blue">using namespace </span><span style="color: #010001">std</span>;
<span style="color: blue">int </span><span style="color: #010001">main</span>()
{
    <span style="color: blue">char </span><span style="color: #010001">str1</span>[]=<span style="color: #a31515">"abc"</span>;
    <span style="color: blue">char </span><span style="color: #010001">str2</span>[]=<span style="color: #a31515">"abc"</span>;

    <span style="color: blue">const char </span><span style="color: #010001">str3</span>[]=<span style="color: #a31515">"abc"</span>;
    <span style="color: blue">const char </span><span style="color: #010001">str4</span>[]=<span style="color: #a31515">"abc"</span>;

    <span style="color: blue">const char </span>*<span style="color: #010001">str5</span>=<span style="color: #a31515">"abc"</span>;
    <span style="color: blue">const char </span>*<span style="color: #010001">str6</span>=<span style="color: #a31515">"abc"</span>;

    <span style="color: blue">char </span>*<span style="color: #010001">str7</span>=<span style="color: #a31515">"abc"</span>;
    <span style="color: blue">char </span>*<span style="color: #010001">str8</span>=<span style="color: #a31515">"abc"</span>;

    <span style="color: #010001">cout</span>&lt;&lt;(<span style="color: #010001">str1</span>==<span style="color: #010001">str2</span>)&lt;&lt;<span style="color: #010001">endl</span>;
    <span style="color: #010001">cout</span>&lt;&lt;(<span style="color: #010001">str3</span>==<span style="color: #010001">str4</span>)&lt;&lt;<span style="color: #010001">endl</span>;
    <span style="color: #010001">cout</span>&lt;&lt;(<span style="color: #010001">str5</span>==<span style="color: #010001">str6</span>)&lt;&lt;<span style="color: #010001">endl</span>;
    <span style="color: #010001">cout</span>&lt;&lt;(<span style="color: #010001">str7</span>==<span style="color: #010001">str8</span>)&lt;&lt;<span style="color: #010001">endl</span>;
    <span style="color: #010001">getchar</span>();
}
</pre>
<p>结果是：</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/Geek/Windows-Live-Writer/f22c2cee6a80_14F7B/image_2.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/Geek/Windows-Live-Writer/f22c2cee6a80_14F7B/image_thumb.png" width="208" height="103"></a></p>
<p>为神马呢？</p>
<p>写个代码来看看内存地址：</p><pre class="code"><span style="color: blue">#include</span><span style="color: #a31515">&lt;iostream&gt;
</span><span style="color: blue">using namespace </span><span style="color: #010001">std</span>;
<span style="color: blue">int </span><span style="color: #010001">main</span>()
{
    <span style="color: blue">char </span><span style="color: #010001">str1</span>[]=<span style="color: #a31515">"abc"</span>;
    <span style="color: blue">char </span><span style="color: #010001">str2</span>[]=<span style="color: #a31515">"abc"</span>;

    <span style="color: blue">const char </span><span style="color: #010001">str3</span>[]=<span style="color: #a31515">"abc"</span>;
    <span style="color: blue">const char </span><span style="color: #010001">str4</span>[]=<span style="color: #a31515">"abc"</span>;

    <span style="color: blue">const char </span>*<span style="color: #010001">str5</span>=<span style="color: #a31515">"abc"</span>;
    <span style="color: blue">const char </span>*<span style="color: #010001">str6</span>=<span style="color: #a31515">"abc"</span>;

    <span style="color: blue">char </span>*<span style="color: #010001">str7</span>=<span style="color: #a31515">"abc"</span>;
    <span style="color: blue">char </span>*<span style="color: #010001">str8</span>=<span style="color: #a31515">"abc"</span>;

    <span style="color: #010001">printf</span>(<span style="color: #a31515">"abc:  %d\n"</span>,&amp;(<span style="color: #a31515">"abc"</span>));
    <span style="color: #010001">printf</span>(<span style="color: #a31515">"str1:  %d\n"</span>,<span style="color: #010001">str1</span>);
    <span style="color: #010001">printf</span>(<span style="color: #a31515">"str2:  %d\n"</span>,<span style="color: #010001">str2</span>);
    <span style="color: #010001">printf</span>(<span style="color: #a31515">"str3:  %d\n"</span>,<span style="color: #010001">str3</span>);
    <span style="color: #010001">printf</span>(<span style="color: #a31515">"str4:  %d\n"</span>,<span style="color: #010001">str4</span>);
    <span style="color: #010001">printf</span>(<span style="color: #a31515">"str5:  %d\n"</span>,<span style="color: #010001">str5</span>);
    <span style="color: #010001">printf</span>(<span style="color: #a31515">"str6:  %d\n"</span>,<span style="color: #010001">str6</span>);
    <span style="color: #010001">printf</span>(<span style="color: #a31515">"str7:  %d\n"</span>,<span style="color: #010001">str7</span>);
    <span style="color: #010001">printf</span>(<span style="color: #a31515">"str8:  %d\n"</span>,<span style="color: #010001">str8</span>);
    <span style="color: #010001">getchar</span>();
    <span style="color: blue">return </span>0;
}
</pre>
<p>结果是：</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/Geek/Windows-Live-Writer/f22c2cee6a80_14F7B/image_4.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.cppblog.com/images/cppblog_com/Geek/Windows-Live-Writer/f22c2cee6a80_14F7B/image_thumb_1.png" width="143" height="158"></a></p>
<p>分析：</p>
<p>str1，str2，str3，str4是数组变量，它们有各自的空间，而数组名就是数组的首地址。</p>
<p>str5，str6，str7，str8是指针，它们指向了相同的常量区域。</p><img src ="http://www.cppblog.com/Geek/aggbug/139771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Geek/" target="_blank">Geek.tan</a> 2011-02-07 00:04 <a href="http://www.cppblog.com/Geek/archive/2011/02/07/139771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>