﻿<?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++博客-Kevin Yang专栏-文章分类-C++</title><link>http://www.cppblog.com/KevinYang/category/4741.html</link><description>技术改变生活</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 22:46:49 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 22:46:49 GMT</pubDate><ttl>60</ttl><item><title>【网络摘录】C++面试题集</title><link>http://www.cppblog.com/KevinYang/articles/31347.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Fri, 31 Aug 2007 18:24:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/31347.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/31347.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/31347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/31347.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/31347.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="color: #040000;">C++面试题集&nbsp;</span>
<div style="color: #040000;"><u><a href="http://blog.chinaunix.net/u/7893/showart_143194.html">http://blog.chinaunix.net/u/7893/showart_143194.html</a></u> <br></div>
<div style="color: #040000;">1. 用预处理指令#define 声明一个常数，用以表明1年中有多少秒（忽略闰年问题）<br>#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL <br>我在这想看到几件事情： <br>1). #define 语法的基本知识（例如：不能以分号结束，括号的使用，等等） <br>2). 懂得预处理器将为你计算常数表达式的值，因此，直接写出你是如何计算一年中有多少秒而不是计算出实际的值，是更清晰而没有代价的。 <br>3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。 <br>4). 如果你在你的表达式中用到UL（表示无符号长整型），那么你有了一个好的起点。记住，第一印象很重要。<br><br>2. 写一个&#8220;标准&#8221;宏MIN，这个宏输入两个参数并返回较小的一个。<br><br>#define MIN(A,B) ((A) &lt;= (B) (A) : (B)) <br>这个测试是为下面的目的而设的： <br><br>1). 标识#define在宏中应用的基本知识。这是很重要的，因为直到嵌入(inline)操作符变为标准C的一部分，宏是方便产生嵌入代码的唯一方法，对于嵌入式系统来说，为了能达到要求的性能，嵌入代码经常是必须的方法。 <br>2). 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码，了解这个用法是很重要的。 <br>3). 懂得在宏中小心地把参数用括号括起来 <br>4). 我也用这个问题开始讨论宏的副作用，例如：当你写下面的代码时会发生什么事？ <br>least = MIN(*p++, b);<br><br>3. 预处理器标识#error的目的是什么？<br><br>如果你不知道<strong style="background-color: #ffff66;">答案</strong>，请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种 <br>问题的<strong style="background-color: #ffff66;">答案</strong>。当然如果你不是在找一个书呆子，那么应试者最好希望自己不要知道<strong style="background-color: #ffff66;">答案</strong>。<br><br>死循环（Infinite loops）<br><br>4. 嵌入式系统中经常要用到无限循环，你怎么样用C编写死循环呢？<br><br>这个问题用几个解决方案。我首选的方案是： <br>while(1) { } <br>一些程序员更喜欢如下方案： <br>for(;;) { } <br>这个实现方式让我为难，因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案，我将用这个作为一个机会去探究他们这样做的 <br>基本原理。如果他们的基本<strong style="background-color: #ffff66;">答案</strong>是：&#8220;我被教着这样做，但从没有想到过为什么。&#8221;这会给我留下一个坏印象。 <br>第三个方案是用 goto <br>Loop: <br>... <br>goto Loop; <br>应试者如给出上面的方案，这说明或者他是一个汇编语言程序员（这也许是好事）或者他是一个想进入新领域的BASIC/FORTRAN程序员。<br><br>数据声明（Data declarations） <br><br>5. 用变量a给出下面的定义 <br>a) 一个整型数（An integer） <br>b) 一个指向整型数的指针（A pointer to an integer） <br>c) 一个指向指针的的指针，它指向的指针是指向一个整型数（A pointer to a pointer to an integer） <br>d) 一个有10个整型数的数组（An array of 10 integers） <br>e) 一个有10个指针的数组，该指针是指向一个整型数的（An array of 10 pointers to integers） <br>f) 一个指向有10个整型数数组的指针（A pointer to an array of 10 integers） <br>g) 一个指向函数的指针，该函数有一个整型参数并返回一个整型数（A pointer to a function that takes an integer as an argument and returns an integer） <br>h)
一个有10个指针的数组，该指针指向一个函数，该函数有一个整型参数并返回一个整型数（ An array of ten pointers to
functions that take an integer argument and return an integer ）<br><br><strong style="background-color: #ffff66;">答案</strong>是： <br>a) int a; // An integer <br>b) int *a; // A pointer to an integer <br>c) int **a; // A pointer to a pointer to an integer <br>d) int a[10]; // An array of 10 integers <br>e) int *a[10]; // An array of 10 pointers to integers <br>f) int (*a)[10]; // A pointer to an array of 10 integers <br>g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer <br>h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer <br><br><br>人们经常声称这里有几个问题是那种要翻一下书才能回答的问题，我同意这种说法。当我写这篇文章时，为了确定语法的正确性，我的确查了一下书。 <br>但是当我被面试的时候，我期望被问到这个问题（或者相近的问题）。因为在被面试的这段时间里，我确定我知道这个问题的<strong style="background-color: #ffff66;">答案</strong>。应试者如果不知道 <br>所有的<strong style="background-color: #ffff66;">答案</strong>（或至少大部分<strong style="background-color: #ffff66;">答案</strong>），那么也就没有为这次面试做准备，如果该面试者没有为这次面试做准备，那么他又能为什么出准备呢？<br><br><br>Static<br><br>6. 关键字static的作用是什么？<br><br>这个简单的问题很少有人能回答完全。在C语言中，关键字static有三个明显的作用： <br>1). 在函数体，一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 <br>2). 在模块内（但在函数体外），一个被声明为静态的变量可以被模块内所用函数访问，但不能被模块外其它函数访问。它是一个本地的全局变量。 <br>3). 在模块内，一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是，这个函数被限制在声明它的模块的本地范围内使用。 <br>大多数应试者能正确回答第一部分，一部分能正确回答第二部分，同是很少的人能懂得第三部分。这是一个应试者的严重的缺点，因为他显然不懂得本地化数据和代码范围的好处和重要性。<br><br><br>Const <br><br>7．关键字const是什么含意？ <br>我
只要一听到被面试者说：&#8220;const意味着常数&#8221;，我就知道我正在和一个业余者打交道。去年Dan
Saks已经在他的文章里完全概括了const的所有用法，因此ESP(译者：Embedded Systems
Programming)的每一位读者应该非常熟悉const能做什么和不能做什么. <br>如果你从没有读到那篇文章，只要能说出const意味着&#8220;只读&#8221;就可以了。尽管这个<strong style="background-color: #ffff66;">答案</strong>不是完全的<strong style="background-color: #ffff66;">答案</strong>，但我接受它作为一个正确的<strong style="background-color: #ffff66;">答案</strong>。（如果你想知道更详细的<strong style="background-color: #ffff66;">答案</strong>，仔细读一下Saks的文章吧。）如果应试者能正确回答这个问题，我将问他一个附加的问题：下面的声明都是什么意思？<br><br>const int a; <br>int const a; <br>const int *a; <br>int * const a; <br>int const * a const;<br><br>前
两个的作用是一样，a是一个常整型数。第三个意味着a是一个指向常整型数的指针（也就是，整型数是不可修改的，但指针可以）。第四个意思a是一个指向整型
数的常指针（也就是说，指针指向的整型数是可以修改的，但指针是不可修改的）。最后一个意味着a是一个指向常整型数的常指针（也就是说，指针指向的整型数
是不可修改的，同时指针也是不可修改的）。如果应试者能正确回答这些问题，那么他就给我留下了一个好印象。顺带提一句，也许你可能会问，即使不用关键字
const，也还是能很容易写出功能正确的程序，那么我为什么还要如此看重关键字const呢？我也如下的几下理由： <br>1).
关键字const的作用是为给读你代码的人传达非常有用的信息，实际上，声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理
其它人留下的垃圾，你就会很快学会感谢这点多余的信息。（当然，懂得用const的程序员很少会留下的垃圾让别人来清理的。） <br>2). 通过给优化器一些附加的信息，使用关键字const也许能产生更紧凑的代码。 <br>3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数，防止其被无意的代码修改。简而言之，这样可以减少bug的出现。<br><br>Volatile <br><br>8. 关键字volatile有什么含意 并给出三个不同的例子。<br><br>一个定义为volatile的变量是说这变量可能会被意想不到地改变，这样，编译器就不会去假设这个变量的值了。精确地说就是，优化器在用到这个变量时必须每次都小心地重新读取这个变量的值，而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子： <br>1). 并行设备的硬件寄存器（如：状态寄存器） <br>2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) <br>3). 多线程应用中被几个任务共享的变量 <br>回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道，所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。 <br>假设被面试者正确地回答了这是问题（嗯，怀疑这否会是这样），我将稍微深究一下，看一下这家伙是不是直正懂得volatile完全的重要性。 <br>1). 一个参数既可以是const还可以是volatile吗？解释为什么。 <br>2). 一个指针可以是volatile 吗？解释为什么。 <br>3). 下面的函数有什么错误： <br>int square(volatile int *ptr) <br>{ <br>return *ptr * *ptr; <br>} <br>下面是<strong style="background-color: #ffff66;">答案</strong>： <br>1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。 <br>2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。 <br>3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方，但是，由于*ptr指向一个volatile型参数，编译器将产生类似下面的代码： <br>int square(volatile int *ptr) <br>{ <br>int a,b; <br>a = *ptr; <br>b = *ptr; <br>return a * b; <br>} <br>由于*ptr的值可能被意想不到地该变，因此a和b可能是不同的。结果，这段代码可能返不是你所期望的平方值！正确的代码如下： <br>long square(volatile int *ptr) <br>{ <br>int a; <br>a = *ptr; <br>return a * a; <br>}<br><br>位操作（Bit manipulation）<br><br>9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a，写两段代码，第一个设置a的bit 3，第二个清除a 的bit 3。在以上两个操作中，要保持其它位不变。<br><br>对这个问题有三种基本的反应 <br>1). 不知道如何下手。该被面者从没做过任何嵌入式系统的工作。 <br>2).
用bit fields。Bit
fields是被扔到C语言死角的东西，它保证你的代码在不同编译器之间是不可移植的，同时也保证了的你的代码是不可重用的。我最近不幸看到
Infineon为其较复杂的通信芯片写的驱动程序，它用到了bit fields因此完全对我无用，因为我的编译器用其它的方式来实现bit
fields的。从道德讲：永远不要让一个非嵌入式的家伙粘实际硬件的边。 <br>3). 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法，是应该被用到的方法。最佳的解决方案如下： <br>#define BIT3 (0x1&lt;&lt;3) <br>static int a; <br>void set_bit3(void) <br>{ <br>a |= BIT3; <br>} <br>void clear_bit3(void) <br>{ <br>a &amp;= ~BIT3; <br>} <br>一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数，这也是可以接受的。我希望看到几个要点：说明常数、|=和&amp;=~操作。<br><br>访问固定的内存位置（Accessing fixed memory locations） <br><br>10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中，要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。<br><br>这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换（typecast）为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下： <br>int *ptr; <br>ptr = (int *)0x67a9; <br>*ptr = 0xaa55;<br><br>一个较晦涩的方法是： <br>*(int * const)(0x67a9) = 0xaa55;<br><br>即使你的品味更接近第二种方案，但我建议你在面试时使用第一种方案。<br><br>中断（Interrupts） <br><br>11.
中断是嵌入式系统中重要的组成部分，这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是，产生了一个新的关键字
__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR)，请评论一下这段代码的。<br><br>__interrupt double compute_area (double radius) <br>{ <br>double area = PI * radius * radius; <br>printf(" Area = %f", area); <br>return area; <br>}<br><br>这个函数有太多的错误了，以至让人不知从何说起了： <br>1). ISR 不能返回一个值。如果你不懂这个，那么你不会被雇用的。 <br>2). ISR 不能传递参数。如果你没有看到这一点，你被雇用的机会等同第一项。 <br>3). 在许多的处理器/编译器中，浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈，有些处理器/编译器就是不允许在ISR中做浮点运算。此外，ISR应该是短而有效率的，在ISR中做浮点运算是不明智的。 <br>4). 与第三点一脉相承，printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点，我不会太为难你的。不用说，如果你能得到后两点，那么你的被雇用前景越来越光明了。<br><br>代码例子（Code examples）<br>12 . 下面的代码输出是什么，为什么？<br><br>void foo(void) <br>{ <br>unsigned int a = 6; <br>int b = -20; <br>(a+b &gt; 6) puts("&gt; 6") : puts("&lt;= 6"); <br>}<br><br>这个问题测试你是否懂得C语言中的整数自动转换原则，我发现有些开发者懂得极少这些东西。不管如何，这无符号整型问题的<strong style="background-color: #ffff66;">答案</strong>是
输出是&#8220;&gt;6&#8221;。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
因此-20变成了一个非常大的正整数，所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错
了这个问题，你也就到了得不到这份工作的边缘。<br><br>13. 评价下面的代码片断：<br><br>unsigned int zero = 0; <br>unsigned int compzero = 0xFFFF; <br>/*1's complement of zero */<br><br>对于一个int型不是16位的处理器为说，上面的代码是不正确的。应编写如下：<br><br>unsigned int compzero = ~0;<br><br>这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里，好的嵌入式程序员非常准确地明白硬件的细节和它的局限，然而PC机程序往往把硬件作为一个无法避免的烦恼。 <br>到
了这个阶段，应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好，那么这个测试就在这里结束了。但如果显然应试者做得不错，那么我就
扔出下面的追加问题，这些问题是比较难的，我想仅仅非常优秀的应试者能做得不错。提出这些问题，我希望更多看到应试者应付问题的方法，而不是<strong style="background-color: #ffff66;">答案</strong>。不管如何，你就当是这个娱乐吧&#8230;<br><br><br>动态内存分配（Dynamic memory allocation）<br><br><br>14. 尽管不像非嵌入式计算机那么常见，嵌入式系统还是有从堆（heap）中动态分配内存的过程的。那么嵌入式系统中，动态分配内存可能发生的问题是什么？<br><br>这
里，我期望应试者能提到内存碎片，碎片收集的问题，变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了（主要是 P.J.
Plauger,
他的解释远远超过我这里能提到的任何解释），所有回过头看一下这些杂志吧！让应试者进入一种虚假的安全感觉后，我拿出这么一个小节目：下面的代码片段的输
出是什么，为什么？<br><br>char *ptr; <br>if ((ptr = (char *)malloc(0)) == NULL) <br>puts("Got a null pointer"); <br>else <br>puts("Got a valid pointer"); <br><br>这
是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc，得到了一个合法的指针之后，我才想到这个问题。这就是上面的代码，该代码的输
出是&#8220;Got a valid pointer&#8221;。我用这个来开始讨论这样的一问题，看看被面试者是否想到库例程这样做是正确。得到正确的<strong style="background-color: #ffff66;">答案</strong>固然重要，但解决问题的方法和你做决定的基本原理更重要些。<br><br>Typedef <br><br>15. Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如，思考一下下面的例子： <br>#define dPS struct s * <br>typedef struct s * tPS; <br><br>以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢？（如果有的话）为什么？ <br>这是一个非常微妙的问题，任何人答对这个问题（正当的原因）是应当被恭喜的。<strong style="background-color: #ffff66;">答案</strong>是：typedef更好。思考下面的例子： <br>dPS p1,p2; <br>tPS p3,p4;<br><br>第一个扩展为 <br>struct s * p1, p2;<br><br>上面的代码定义p1为一个指向结构的指，p2为一个实际的结构，这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。<br><br>晦涩的语法<br><br>16. C语言同意一些令人震惊的结构,下面的结构是合法的吗，如果是它做些什么？ <br>int a = 5, b = 7, c; <br>c = a+++b;<br><br>这个问题将做为这个测验的一个愉快的结尾。不管你相不相信，上面的例子是完全合乎语法的。问题是编译器如何处理它？水平不高的编译作者实际上会争论这个问题，根据最处理原则，编译器应当能处理尽可能所有合法的用法。因此，上面的代码被处理成： <br>c = a++ + b; <br>因此, 这段代码持行后a = 6, b = 7, c = 12。 <br>如果你知道<strong style="background-color: #ffff66;">答案</strong>，或猜出正确<strong style="background-color: #ffff66;">答案</strong>，做得好。如果你不知道<strong style="background-color: #ffff66;">答案</strong>，我也不把这个当作问题。我发现这个问题的最大好处是:这是一个关于代码编写风格，代码的可读性，代码的可修改性的好的话题<br><br>What will print out? <br><br>main() <br>{ <br>char *p1=&#8220;name&#8221;; <br>char *p2; <br>p2=(char*)malloc(20); <br>memset (p2, 0, 20); <br>while(*p2++ = *p1++); <br>printf(&#8220;%sn&#8221;,p2); <br><br>} <br><br>Answer:empty string. <br><br>What will be printed as the result of the operation below:<br><br>main() <br>{ <br>int x=20,y=35; <br>x=y++ + x++; <br>y= ++y + ++x; <br>printf(&#8220;%d%dn&#8221;,x,y); <br>} <br><br>Answer : 5794 <br><br>What will be printed as the result of the operation below:<br><br>main() <br>{ <br>int x=5; <br>printf(&#8220;%d,%d,%dn&#8221;,x,x&lt; &lt;2,x&gt;&gt;2); <br>}<br><br>Answer: 5,20,1 <br><br>What will be printed as the result of the operation below:<br><br>#define swap(a,b) a=a+b;b=a-b;a=a-b; <br>void main()<br>{ <br>int x=5, y=10; <br>swap (x,y); <br>printf(&#8220;%d %dn&#8221;,x,y); <br>swap2(x,y); <br>printf(&#8220;%d %dn&#8221;,x,y); <br>} <br><br>int swap2(int a, int b) <br>{ <br>int temp; <br>temp=a; <br>b=a; <br>a=temp; <br>return 0; <br><br>} <br><br>Answer: 10, 5<br>10, 5 <br><br>What will be printed as the result of the operation below:<br><br>main()<br>{ <br>char *ptr = &#8221; Cisco Systems&#8221;; <br>*ptr++; printf(&#8220;%sn&#8221;,ptr); <br>ptr++; <br>printf(&#8220;%sn&#8221;,ptr); <br>} <br><br>Answer:Cisco Systems<br>isco systems <br><br>What will be printed as the result of the operation below:<br><br>main()<br>{ <br>char s1[]=&#8220;Cisco&#8221;; <br>char s2[]= &#8220;systems&#8221;; <br>printf(&#8220;%s&#8221;,s1); <br>} <br>Answer: Cisco <br><br>What will be printed as the result of the operation below:<br><br>main()<br>{ <br>char *p1; <br>char *p2; <br>p1=(char *)malloc(25); <br>p2=(char *)malloc(25); <br><br>strcpy(p1,&#8221;Cisco&#8221;); <br>strcpy(p2,&#8220;systems&#8221;); <br>strcat(p1,p2); <br><br>printf(&#8220;%s&#8221;,p1); <br><br>} <br><br>Answer: Ciscosystems <br><br>The following variable is available in file1.c, who can access it?:<br><br>static int average;<br><br>Answer: all the functions in the file1.c can access the variable. <br><br>WHat will be the result of the following code?<br><br>#define TRUE 0 // some code <br>while(TRUE) <br>{ <br><br>// some code <br><br>} <br><br>Answer: This will not go into the loop as TRUE is defined as 0. <br><br>What will be printed as the result of the operation below:<br><br>int x; <br>int modifyvalue() <br>{ <br>return(x+=10); <br>} <br>int changevalue(int x) <br>{ <br>return(x+=1); <br>} <br><br>void main()<br>{ <br>int x=10; <br>x++; <br>changevalue(x); <br>x++; <br>modifyvalue(); <br>printf("First output:%dn",x); <br><br>x++; <br>changevalue(x); <br>printf("Second output:%dn",x); <br>modifyvalue(); <br>printf("Third output:%dn",x); <br><br>} <br><br>Answer: 12 , 13 , 13 <br><br>What will be printed as the result of the operation below:<br><br>main()<br>{ <br>int x=10, y=15; <br>x = x++; <br>y = ++y; <br>printf(&#8220;%d %dn&#8221;,x,y); <br>} <br><br>Answer: 11, 16 <br><br>What will be printed as the result of the operation below:<br><br>main()<br>{ <br>int a=0; <br>if(a==0) <br>printf(&#8220;Cisco Systemsn&#8221;); <br>printf(&#8220;Cisco Systemsn&#8221;); <br>} <br><br>Answer: Two lines with &#8220;Cisco Systems&#8221; will be printed. <br><br><br><br><strong> 再次更新C++相关题集</strong> <br><br>1. 以下三条输出语句分别输出什么？[C易]<br>char str1[] = "abc";<br>char str2[] = "abc";<br>const char str3[] = "abc"; <br>const char str4[] = "abc"; <br>const char* str5 = "abc";<br>const char* str6 = "abc";<br>cout &lt;&lt; boolalpha &lt;&lt; ( str1==str2 ) &lt;&lt; endl; // 输出什么？<br>cout &lt;&lt; boolalpha &lt;&lt; ( str3==str4 ) &lt;&lt; endl; // 输出什么？<br>cout &lt;&lt; boolalpha &lt;&lt; ( str5==str6 ) &lt;&lt; endl; // 输出什么？<br><br>13. 非C++内建型别 A 和 B，在哪几种情况下B能隐式转化为A？[C++中等]<br>答：<br>a. class B : public A { &#8230;&#8230;} // B公有继承自A，可以是间接继承的<br>b. class B { operator A( ); } // B实现了隐式转化为A的转化<br>c. class A { A( const B&amp; ); } // A实现了non-explicit的参数为B（可以有其他带默认值的参数）构造函数<br>d. A&amp; operator= ( const A&amp; ); // 赋值操作，虽不是正宗的隐式类型转换，但也可以勉强算一个<br><br>12. 以下代码中的两个sizeof用法有问题吗？[C易]<br>void <strong style="background-color: #a0ffff;">UpperCase</strong>( char str[] ) // 将 str 中的小写字母转换成大写字母<br>{<br>for( size_t i=0; i&lt;sizeof(str)/sizeof(str[0]); ++i )<br>if( 'a'&lt;=str[i] &amp;&amp; str[i]&lt;='z' )<br>str[i] -= ('a'-'A' );<br>}<br>char str[] = "aBcDe";<br>cout &lt;&lt; "str字符长度为: " &lt;&lt; sizeof(str)/sizeof(str[0]) &lt;&lt; endl;<br><strong style="background-color: #a0ffff;">UpperCase</strong>( str );<br>cout &lt;&lt; str &lt;&lt; endl;<br><br>7. 以下代码有什么问题？[C难]<br>void char2Hex( char c ) // 将字符以16进制表示<br>{<br>char ch = c/0x10 + '0'; if( ch &gt; '9' ) ch += ('A'-'9'-1);<br>char cl = c%0x10 + '0'; if( cl &gt; '9' ) cl += ('A'-'9'-1);<br>cout &lt;&lt; ch &lt;&lt; cl &lt;&lt; ' ';<br>}<br>char str[] = "I love 中国";<br>for( size_t i=0; i&lt;strlen(str); ++i )<br>char2Hex( str[i] );<br>cout &lt;&lt; endl;<br><br>4. 以下代码有什么问题？[C++易]<br>struct Test<br>{<br>Test( int ) {}<br>Test() {}<br>void fun() {}<br>};<br>void main( void )<br>{<br>Test a(1);<br>a.fun();<br>Test b();<br>b.fun();<br>}<br><br>5. 以下代码有什么问题？[C++易]<br>cout &lt;&lt; (true?1:"1") &lt;&lt; endl;<br><br>8. 以下代码能够编译通过吗，为什么？[C++易]<br>unsigned int const size1 = 2;<br>char str1[ size1 ];<br>unsigned int temp = 0;<br>cin &gt;&gt; temp;<br>unsigned int const size2 = temp;<br>char str2[ size2 ];<br><br>9. 以下代码中的输出语句输出0吗，为什么？[C++易]<br>struct CLS<br>{<br>int m_i;<br>CLS( int i ) : m_i(i) {}<br>CLS()<br>{<br>CLS(0);<br>}<br>};<br>CLS obj;<br>cout &lt;&lt; obj.m_i &lt;&lt; endl;<br><br>10. C++中的空类，默认产生哪些类成员函数？[C++易]<br>答：<br>class Empty<br>{<br>public:<br>Empty(); // 缺省构造函数<br>Empty( const Empty&amp; ); // 拷贝构造函数<br>~Empty(); // 析构函数<br>Empty&amp; operator=( const Empty&amp; ); // 赋值运算符<br>Empty* operator&amp;(); // 取址运算符<br>const Empty* operator&amp;() const; // 取址运算符 const<br>};<br><br>3. 以下两条输出语句分别输出什么？[C++难]<br>float a = 1.0f;<br>cout &lt;&lt; (int)a &lt;&lt; endl;<br>cout &lt;&lt; (int&amp;)a &lt;&lt; endl;<br>cout &lt;&lt; boolalpha &lt;&lt; ( (int)a == (int&amp;)a ) &lt;&lt; endl; // 输出什么？<br>float b = 0.0f;<br>cout &lt;&lt; (int)b &lt;&lt; endl;<br>cout &lt;&lt; (int&amp;)b &lt;&lt; endl;<br>cout &lt;&lt; boolalpha &lt;&lt; ( (int)b == (int&amp;)b ) &lt;&lt; endl; // 输出什么？<br><br>2. 以下反向遍历array数组的方法有什么错误？[STL易]<br>vector array;<br>array.push_back( 1 );<br>array.push_back( 2 );<br>array.push_back( 3 ); <br><br>for( vector::size_type i=array.size()-1; i&gt;=0; --i ) // 反向遍历array数组<br>{<br>cout &lt;&lt; array[i] &lt;&lt; endl;<br>}<br><br>6. 以下代码有什么问题？[STL易]<br>typedef vector IntArray;<br>IntArray array;<br>array.push_back( 1 );<br>array.push_back( 2 );<br>array.push_back( 2 );<br>array.push_back( 3 );<br>// 删除array数组中所有的2<br>for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )<br>{<br>if( 2 == *itor ) array.erase( itor );<br>}<br><br>11. 写一个函数，完成内存之间的拷贝。[考虑问题是否全面]<br>答：<br></div>
<div style="color: #040000;">
<div><img alt="程序代码" src="http://www.ad0.cn/netfetch/images/code.gif"> 程序代码</div>
<div>void* mymemcpy( void *dest, const void *src, size_t count )<br>{<br>char* pdest = static_cast&lt;char*&gt;( dest );<br>const char* psrc = static_cast&lt;const char*&gt;( src );<br>if( pdest&gt;psrc &amp;&amp; pdest&lt;psrc+cout ) 能考虑到这种情况就行了<br>{<br>for( size_t i=count-1; i!=-1; --i )<br>pdest[i] = psrc[i];<br>}<br>else<br>{<br>for( size_t i=0; i&lt;count; ++i )<br>pdest[i] = psrc[i];<br>}<br>return dest;<br>}<br>int main( void )<br>{<br>char str[] = "0123456789";<br>mymemcpy( str+1, str+0, 9 );<br>cout &lt;&lt; str &lt;&lt; endl;<br><br>system( "Pause" );<br>return 0;<br>}</div>
</div>
<div style="color: #040000;"><br><br><strong> 更多相关面试题请参阅这里：</strong> <br><a href="http://www.ad0.cn/netfetch/article.asp?id=534" target="_blank"><u>最全的C\C++面试题集(C\C++试题和部分<strong style="background-color: #ffff66;">答案</strong>)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=583" target="_blank"><u>最全的C\C++面试题集(最全的C\C++试题集和<strong style="background-color: #ffff66;">答案</strong>)(续)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=342" target="_blank"><u>一道有趣的C#考试题目 </u></a><br><strong> <a href="http://www.ad0.cn/netfetch/article.asp?id=379" target="_blank"><u>Java面试题汇总及c/c++面试题(最新最全) </u></a></strong> <br><a href="http://www.ad0.cn/netfetch/article.asp?id=343" target="_blank"><u>某公司招收.net高级程序员的试卷 </u></a><br><strong> <a href="http://www.ad0.cn/netfetch/article.asp?id=341" target="_blank"><u>.Net面试题集(最全最新)(欢迎加入更多.Net 面试题)</u></a></strong> <br><br><a href="http://www.ad0.cn/netfetch/article.asp?id=235" target="_blank"><u>Google：21道能力倾向测试面试题 </u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=234" target="_blank"><u>GOOGLE面试题 </u></a><br><strong> <a href="http://www.ad0.cn/netfetch/article.asp?id=233" target="_blank"><u>Google的面试题，你能做出多少？</u></a></strong> <br><br><a href="http://www.ad0.cn/netfetch/article.asp?id=236" target="_blank"><u>据说是阿尔卡特（中国）的面试题目(C)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=223" target="_blank"><u>世界大公司面试题——微软的面试题</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=223" target="_blank"><u>世界大公司面试题——微软的面试题（<strong style="background-color: #ffff66;">答案</strong>）</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=276" target="_blank"><u>成为编程高手的基础素养</u></a> <br><a href="http://www.ad0.cn/netfetch/article.asp?id=380" target="_blank"><u>微软面试题——微软的智力题——三个灯泡 </u></a><br><br><a href="http://www.ad0.cn/netfetch/article.asp?id=369" target="_blank"><u>J2EE面试题集(附<strong style="background-color: #ffff66;">答案</strong>)</u></a><br><strong> <a href="http://www.ad0.cn/netfetch/article.asp?id=482" target="_blank"><u>Java常见面试题集--面试题全面综合(一)</u></a></strong> <br><a href="http://www.ad0.cn/netfetch/article.asp?id=483" target="_blank"><u>Java常见面试题集--面试题全面综合(二)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=361" target="_blank"><u>Java面试题集(欢迎大家踊跃提供) </u></a><br><a href="http://www.ad0.cn/netfetch/search.asp?SearchContent=%E5%BE%AE%E8%BD%AF&amp;searchType=title&amp;page=1" target="_blank"><u>更多相关面试试题</u></a> <br><br>阅读本站更多 Sql Server面试,数据库面试 相关文章：<br><a href="http://www.ad0.cn/netfetch/article.asp?id=25" target="_blank"><u>2006年你怎样成为数据库技术专才</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=24" target="_blank"><u>成就DBA职业生涯(中文翻译版)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=493" target="_blank"><u>某门户网站数据库职位(DBA)笔试题</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=492" target="_blank"><u>某数据集团数据库初试笔试题(数据库面试 笔试题)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=491" target="_blank"><u>SQL难题：看似简单的查询(Access 数据库)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=592" target="_blank"><u>数据库面试常用测试题(SQL Server)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=187" target="_blank"><u>Oracle性能调优原则</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=493" target="_blank"><u>某门户网站数据库Oracle笔试题(DBA职位)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=531" target="_blank"><u>Oracle面试(DBA For oracle数据库)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=538" target="_blank"><u>数据库面试(Oracle与Sql专题)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=89" target="_blank"><u>批更改数据库对象所有者nf_ChangeObjectOwner（Ad0.Cn原创）</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=591" target="_blank"><u>SQL Server管理技巧(系列&#8230;&#8230;)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=590" target="_blank"><u>SQL Server常见安全问题及解决</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=180" target="_blank"><u>《通用高效分页存储过程代码》</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=179" target="_blank"><u>《一个高效的数据分页的存储过程 可以轻松应付百万数据》</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=197" target="_blank"><u>千万数量级分页存储过程</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=177" target="_blank"><u>存储过程编写经验和优化措施</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=178" target="_blank"><u>使用SQL存储过程要特别注意的问题-注意顺序读取</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=296" target="_blank"><u>在项目中该不该使用存储过程代替SQL语句? </u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=55" target="_blank"><u>SQL 语句中的通配符</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=90" target="_blank"><u>SQL Server系统存储过程sp_changeobjectowner</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=91" target="_blank"><u>Sql Server一个未公开的存储过程</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=136" target="_blank"><u>高效SQL——合并多个字段值或多条记录</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=178" target="_blank"><u>使用SQL存储过程要特别注意的问题-注意顺序读取</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=186" target="_blank"><u>分享：SQL 2005安装心得</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=239" target="_blank"><u>Asp SQL注入天书-ASP注入漏洞全接触</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=395" target="_blank"><u>链接服务器的配置和使用(SQL Server)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=413" target="_blank"><u>SQL Server 2005</u></a><a href="http://www.sman.cn/netfetch/default.asp?tag=%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank"><u>数据库开发</u></a>(VS 2005)(一)<br><a href="http://www.ad0.cn/netfetch/article.asp?id=315" target="_blank"><u>Sql存储过程加密和解密</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=520" target="_blank"><u>MySQL数据库存储引擎详解 </u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=529" target="_blank"><u>某外企DBA职位的SQL Server面试题(数据库面试题)</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=532" target="_blank"><u>Apache+Mysql+Php+ssl服务器DIY之完全安装攻略</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=588" target="_blank"><u>SQL Server常用的系统存储过程应用实例</u></a><br><a href="http://www.ad0.cn/netfetch/article.asp?id=589" target="_blank"><u>SQL Server三个常见错误分析及解决(SQL Server连接)</u></a><br>C++面试题集和<strong style="background-color: #ffff66;">答案</strong>,C++面试基础题,C++笔试题和<strong style="background-color: #ffff66;">答案</strong><br><br><br></div>
<div style="color: #040000;">[本日志由 NetFetch 于 2006-07-10 09:26 AM 编辑]<br><img alt="" src="http://www.ad0.cn/netfetch/images/From.gif"><strong> 文章来自:</strong>  <a href="http://www.ad0.cn/netfetch/" target="_blank"><u>本站原创</u></a><br><u><img alt="" src="http://www.ad0.cn/netfetch/images/icon_trackback.gif"></u><strong> 引用通告地址:</strong>  <a href="http://www.ad0.cn/netfetch/trackback.asp?tbID=534" target="_blank"><u>http://www.ad0.cn/netfetch/trackback.asp?tbID=534</u></a><br><u><img alt="" src="http://www.ad0.cn/netfetch/images/tag.gif"></u><strong> Tags:</strong>  <a href="http://www.ad0.cn/netfetch/default.asp?tag=C%2B%2B%E9%9D%A2%E8%AF%95%E9%A2%98%E9%9B%86"><u>C++面试题集</u></a><a style="display: none;" href="http://www.ad0.cn/netfetch/article.asp?id=534#C++%E9%9D%A2%E8%AF%95%E9%A2%98%E9%9B%86" rel="tag"><u>C++面试题集</u></a> <a href="http://www.ad0.cn/netfetch/default.asp?tag=C%2B%2B%E9%9D%A2%E8%AF%95%E7%AD%94%E6%A1%88"><u>C++面试<strong style="background-color: #ffff66;">答案</strong></u></a><a style="display: none;" href="http://www.ad0.cn/netfetch/article.asp?id=534#C++%E9%9D%A2%E8%AF%95%E7%AD%94%E6%A1%88" rel="tag"><u>C++面试<strong style="background-color: #ffff66;">答案</strong></u></a> <a href="http://www.ad0.cn/netfetch/default.asp?tag=C%2B%2B%E9%9D%A2%E8%AF%95"><u>C++面试</u></a><a style="display: none;" href="http://www.ad0.cn/netfetch/article.asp?id=534#C++%E9%9D%A2%E8%AF%95" rel="tag"><u>C++面试</u></a> <a href="http://www.ad0.cn/netfetch/default.asp?tag=C%2B%2B%E8%AF%95%E9%A2%98"><u>C++试题</u></a><a style="display: none;" href="http://www.ad0.cn/netfetch/article.asp?id=534#C++%E8%AF%95%E9%A2%98" rel="tag"><u>C++试题</u></a> <br></div>
<div style="color: #040000;">
评论: 10 | 引用: 3 | 查看次数: 1739 </div>
<div style="color: #040000;">
<div style="float: right;">
<ul>
    <li><strong> 1</strong>  | <a href="http://www.ad0.cn/netfetch/article.asp?id=534&amp;page=2#comm_top"><u>2</u></a> | <a title="最后一页" style="text-decoration: none;" href="http://www.ad0.cn/netfetch/article.asp?id=534&amp;page=2#comm_top">&gt;</a></li>
</ul>
</div>
</div>
<div style="color: #040000;">
<div><img alt="" src="http://www.ad0.cn/netfetch/images/icon_trackback.gif"><strong> <a href="http://liquid-glucosamine-nbr.blogspot.com/"><u>liquid glucosamine</u></a></strong>  [2006-07-19 03:31 PM]</div>
<div><strong>标题:</strong> liquid glucosamine<br><strong>链接:</strong> <a href="http://liquid-glucosamine-nbr.blogspot.com/" target="_blank"><u>http://liquid-glucosamine-nbr.blogspot.com</u></a><br><strong>摘要:</strong> Buy liquid glucosamine Online<br><br></div>
</div>
<div style="color: #040000;">
<div><img alt="" src="http://www.ad0.cn/netfetch/images/icon_trackback.gif"><strong> <a href="http://www.telringtones.org/"><u>Ringtones</u></a></strong>  [2006-07-18 07:50 PM]</div>
<div><strong>标题:</strong> ringtones<br><strong>链接:</strong> <a href="http://www.telringtones.org/" target="_blank"><u>http://www.telringtones.org</u></a><br><strong>摘要:</strong> Free ringtones.<br><br></div>
</div>
<div style="color: #040000;">
<div><a><img alt="" src="http://www.ad0.cn/netfetch/images/icon_quote.gif" border="0"></a><a href="http://www.ad0.cn/netfetch/member.asp?action=view&amp;memName=NetFetch"><strong> <u>NetFetch</u></strong> </a>C++面试题集(最全的C\C++试题集和部分<strong style="background-color: #ffff66;">答案</strong>) [2006-07-07 09:24 AM]</div>
<div><strong> C++面试题集锦 2006-7-7更新</strong> <br><br>29.编写一个函数，函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回.<br>30.编写一个函数将一条字符串分成两部分，将前半部分按ASCII码升序排序，后半部分不变，（如果字符串是奇数则中间的字符不变，）最后再将前后两部分交换，然后将该字符串输出，<br>测试字符串&#8220;ADZDDJKJFIEJHGI&#8221;<br>31.找错<br>Void test1()<br>{<br>char string[10];<br>char* str1="0123456789";<br>strcpy(string, str1);<br>}<br><br><br>Void test2()<br>{<br>char string[10], str1[10];<br>for(I=0; I&lt;10;I++)<br>{<br>str1[i] ='a';<br>}<br>strcpy(string, str1);<br>}<br><br>Void test3(char* str1)<br>{<br>char string[10];<br>if(strlen(str1)&lt;=10)<br>{<br>strcpy(string, str1);<br>}<br>}<br><br><br>32. 找错<br>#define MAX_SRM 256<br><br>DSN get_SRM_no()<br>{<br>static int SRM_no;<br>int I;<br>for(I=0;I{<br>SRM_no %= MAX_SRM;<br>if(MY_SRM.state==IDLE)<br>{<br>break;<br>}<br>}<br>if(I&gt;=MAX_SRM)<br>return (NULL_SRM);<br>else<br>return SRM_no;<br>}<br><br><br>33. 写出程序运行结果<br><br>int sum(int a)<br>{<br>auto int c=0;<br>static int b=3;<br>c+=1;<br>b+=2;<br>return(a+b+C);<br>}<br><br>void main()<br>{<br>int I;<br>int a=2;<br>for(I=0;I&lt;5;I++)<br>{<br>printf("%d,", sum(a));<br>}<br>}<br><br>34. <br><br>int func(int a)<br>{<br>int b;<br>switch(a)<br>{<br>case 1: 30;<br>case 2: 20;<br>case 3: 16;<br>default: 0<br>}<br>return b;<br>}<br>则func(1)=?<br><br>35:<br>int a[3];<br>a[0]=0; a[1]=1; a[2]=2;<br>int *p, *q;<br>p=a;<br>q=&amp;a[2];<br>则a[q-p]=?<br><br>36. <br>定义 int **a[3][4], 则变量占有的内存空间为：_____<br>37.<br>编写一个函数，要求输入年月日时分秒，输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒，则输出2005年1月1日0时0分0秒。<br>38.写一个函数，判断一个int型的整数是否是2的幂，即是否可以表示成2^X的形式（不可以用循环）<br>我只知道是用递推，大概写了一下，如下：<br>int IsTwoPow(int s)<br>{<br>if(s==1)return FALSE;<br>s=s&gt;&gt;1;<br>if(s&gt;1)IsTwoPow(s);<br>return (s==1)?TRUE:FALSE;//大概是这个意思，但是这一句似乎不该这么返回！<br>}<br><br>39 A，B从一堆玻璃球（共100个）里向外拿球，规则如下：<br>(1)A先拿，然后一人一次交替着拿；<br>（2）每次只能拿1个或2个或4个；<br>（3）谁拿最后一个球，谁就是最后的失败者；<br>问A，B谁将是失败者？写出你的判断步骤。<br>40.已知：无序数组，折半查找，各元素值唯一。<br>函数原型是：Binary_Seach(int array[], int iValue, int iCount)<br>array是数组，在里面用折半查找的方法找等于iValue的值，找到返回1否则0，iCount是元素个数<br>41.统计一个字符串中字符出现的次数<br>42.100位以上的超大整数的加法（主要考虑数据结构和加法的实现）。<br>43.对如下电文："CASTCASTSATATATASA"给出Huffman编码。<br>44.int (* (*f)(int, int))(int)表示什么含义？<br>45.x=x+1，x+=1，x++，为这三个语句的效率排序。并说明为什么。<br>46.中缀表达式 A-(B+C/D)*E的后缀形式是什么？<br>47.struct S1<br>{<br>char c;<br>int i;<br>};<br>sizeof(S1) = ?<br><br>class X{<br>public:<br>X();<br>virtual ~X();<br>void myMemberFunc();<br>static void myStaticFunc();<br>virtual void myVirtualFunc();<br>private:<br>int i;<br>char * pstr;<br>char a;<br>}<br>sizeof(X) = ?<br>48.找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的最大子串为"actyet"<br>49.有一百个整数,其中有负数,找出连续三个数之和最大的部分.<br>50.写一程序实现快速排序. 假设数据输入为一文件<br>快速算法描述如下 <br>Algorithm Partition <br>Input: sequence a0, ..., an-1 with n elements <br>Output: permutation of the sequence such that all elements a0, ..., aj are less than or equal to all<br>elements ai, ..., an-1 (i &gt; j) <br>Method: <br><br>choose the element in the middle of the sequence as comparison element x <br>let i = 0 and j = n-1 <br>while ij <br><br>search the first element ai which is greater than or equal to x <br>search the last element aj which is less than or equal to x <br>if ij <br><br>exchange ai and aj <br>let i = i+1 and j = j-1 <br>After partitioning the sequence, Quicksort treats the two parts recursively by the same procedure.<br>The recursion ends whenever a part consists of one element only. <br>51.写一算法检测单向链表中是否存在环(whether there is a loop in a link list),<br>要求算法复杂度(Algorithm's complexity是O(n)) 并只使用常数空间(space is O(c)). <br>注意，你只知道一个指向单向链表头的指针。链表的长度是不定的，而且环出现的地方也是不定的，环有可能在头，有可能在中间。而且要求是检测, 不能破坏环的结构.<br>52.设下列函数已经通过了调试<br>bool Sort_Array(ArrayType * Pinputarray, ArrayType * Poutarray);<br>该函数在内存中排序，能把字节数最大为100M字节的ArrayType类型的数组排序。其中ArrayType是一个<br>预定义的数组类型（细节无关紧要），Pinputarray，Poutarray分别为排序前的指针和排序后的指针。<br>请用c语言的伪码风格设计一个算法，他调用上面给出的函数完成下列从输入到输出的任务：<br>输入：排序前的大文件，名称为char * pinoutfilename ，其内容为用分号分隔的ArrayType类型的数组元素，可装满4个100M字节的数组。<br>输出：排序后的大文件char * poutoutfilename。<br>53.用最有效率的方法算出2乘以8等於几？<br>54.<br>1.错误的转义字符是 (ｃ )<br>A.'\091' B.'\\'<br>C.'\0' D.'\''<br><br>2.若数组名作实参而指针变量作形参，函数调用实参传给形参的是 (ｄ )<br>A.数组的长度 B.数组第一个元素的值<br>C.数组所有元素的值 D.数组第一个元素的地址<br><br>3.变量的指针含意是指变量的 (ｂ )<br>A.值 B.地址<br>C.存储 D.名字<br><br>5.某文件中定义的静态全局变量(或称静态外部变量)其作用域是 (ｄ )<br>A.只限某个函数 B.本文件<br>C.跨文件 D.不限制作用域<br>55.<br>1. 解二次方程:a*x*x+b*x+c<br>int Quadratic( double a,double b,double c,double&amp; x1,double&amp; x2);<br>返回值：解的个数<br><br>2. 最大公约数<br>DWORD Divisor( DWORD dwFirst, DWORD dwSecond );<br>返回值：最大公约数<br><br>3. 根据蒙特卡洛算法计算圆周率<br>double PI( DOWRD dwCount/*测试次数*/ )；<br>返回值：PI<br><br>4. 无符号整数乘法，乘数为32bit，结果为64bit<br>提示：32bit整数分解为16bit相乘<br>void Multiply( DWORD dwFirst, DWORD dwSecond, DWORD&amp; dwHigh, DWORD&amp; dwLower );<br><br>5. 链表排序(从小到大)<br>节点定义为：<br>struct Node{<br>int nValue;<br>struct Node* pNext;<br>};<br>最后一个节点的pNext = NULL.<br>Node* SortChain( Node* pHead );<br>返回值：链表头</div>
</div>
<div style="color: #040000;">
<div><a><img alt="" src="http://www.ad0.cn/netfetch/images/icon_quote.gif" border="0"></a><a href="http://www.ad0.cn/netfetch/member.asp?action=view&amp;memName=NetFetch"><strong> <u>NetFetch</u></strong> </a>C++面试题集(最全的C\C++试题集和部分<strong style="background-color: #ffff66;">答案</strong>) [2006-07-07 09:23 AM]</div>
<div><strong> c/c++面试题集锦 2006-7-7更新</strong> <br>24.Assignment 2: Picture Processing<br><br>Use
C++, Java, or similar languages or/and any middleware such as EJB and
J2EE to process a picture with a high resolution (3 Mega Pixels for
example). Use some methodologies to degrade the resolution of the
picture to make it quicker for browsing. Then divide the degraded
picture into 9 sectors equally. Click any of the 9 sectors will result
a detailed picture for this sector with the same resolution as that of
the original picture. This assignment is designed for you to
demonstrate your ability to handle pictures. <br>25.用&lt;&lt;,&gt;&gt;,|,&amp;实现一个WORD(2个字节)的高低位交换!!<br>26.要开辟P1,P2,P3,P4内存来做缓冲,大小自定,但这四个缓冲的大小要一样,并且是连续的!<br>27.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)<br>28.找错：<br>#include &lt;string.h&gt;<br>#include &lt;stdio.h&gt;<br>class Base<br>{<br>private:<br>char * name;<br>public:<br>Base(char * className)<br>{<br>name = new char[strlen(className)];<br>strcpy(name, className);<br>}<br>~Base()<br>{<br>delete name;<br>}<br>char * copyName()<br>{<br>char newname [256];<br>strcpy(newname, name);<br>return newname;<br>}<br>char * getName()<br>{<br>return name;<br>}<br>static void print(Base base)<br>{<br>printf("name: %s\n" , base.name);<br>}<br>};<br>class Subclass : public Base<br>{<br>public:<br>Subclass(char * className) : Base(className)<br>{<br>}<br>};<br>int main()<br>{<br>Base * pBase = new Subclass("test");<br>Base::print(*pBase);<br>printf("name: %s\n", pBase-&gt;getName());<br>printf("new name: %s\n", pBase-&gt;copyName());<br>return 0;<br>}<br></div>
</div>
<div style="color: #040000;">
<div><a><img alt="" src="http://www.ad0.cn/netfetch/images/icon_quote.gif" border="0"></a><a href="http://www.ad0.cn/netfetch/member.asp?action=view&amp;memName=NetFetch"><strong> <u>NetFetch</u></strong> </a>C++面试题集(最全的C\C++试题集和部分<strong style="background-color: #ffff66;">答案</strong>) [2006-07-07 09:22 AM]</div>
<div><strong> c/c++面试题集锦 2006-7-7更新</strong> <br><br>21.有双向循环链表结点：<br>typedef struct node<br>{<br>int date;<br>struct node *front,*next;<br>}_Node;<br>有两个双向循环链表A，B，知道其头指针为：pHeadA,pHeadB，请写一函数将两上链表中date值相同的结点删除<br><br>22.<br>char * GetStr()<br>{<br>char *tmp;<br>tmp = "123"<br>return tmp;<br>}<br><br>void main()<br>{<br>printf("%s", GetStr());<br>}<br><br>会输出123吗？123创建在堆上还是栈上呢？123的空间是什么时候释放的？<br><br>23.<br>字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大？为什么？ <br>类ClassB从ClassA派生，那么ClassA *a = new ClassB(&#8230;); 试问该表达是否合法？为什么？<br>如果ClassA中定义并实现虚函数int func(void)，ClassB中也实现该函数，那么上述变量a-&gt;func()将调用哪个类里面的函数？如果int func(void)不是虚函数，情况又如何？为什么？<br>char **p, a[16][8]; 问：p=a是否会导致程序在以后出现问题？为什么？<br>如下所述的if else和switch语句哪个的效率高？为什么？<br>在同一个进程中，一个模块是否可以通过指针操作破坏其它模块的内存，为什么？<br>应用程序在运行时的内存包括代码区和数据区，其中数据区又包括哪些部分？</div>
</div>
<div style="color: #040000;">
<div><a><img alt="" src="http://www.ad0.cn/netfetch/images/icon_quote.gif" border="0"></a><a href="http://www.ad0.cn/netfetch/member.asp?action=view&amp;memName=NetFetch"><strong> <u>NetFetch</u></strong> </a>C++面试题集(最全的C\C++试题集和部分<strong style="background-color: #ffff66;">答案</strong>) [2006-07-06 09:20 AM]</div>
<div><strong> c/c++面试题集锦 2006-7-6更新</strong> <br><br>18.Consider the following code:<br><br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;<br>int main(int argc, char *argv[]) {<br>int i = 1;<br>char buf[4];<br>strcpy(buf, "AAAA");<br>printf("%d\n", i);<br>return 0;<br>}<br><br>a) When compiled and executed on x86, why does this program usually not <br>output what the programmer intended?<br><br>b) Name several ways in which the security problem that causes this <br>program not to output what the programmer intended can be prevented <br>WITHOUT changing the code.<br><br>19.int w=1,x=2,y=3,z=4;<br>m=(w&lt;x)?w:x;<br>m=(m&lt;y)?m:y;<br>m=(m&lt;2)?m:z;<br>printf("m=%d",m); 说出结果<br>20.说出结果<br>#include &lt;stdio.h&gt;<br>main()<br>{<br>FILE *fp;<br>int i,a[4]={1,2,3,4},b;<br>fp=fopen("data.dat","wb");//这里帮忙解释一下<br>for(i=0;i&lt;4;i++)<br>fwrite(&amp;a[i],sizeof(int),1,fp);//这里也帮忙看一下<br>fclose(fp);<br>fp=fopen("data.dat","rb");<br>fseek(fp,-2L*sizeof(int),SEEK_END);//还有这里<br>fread(&amp;b,sizeof(int),1,fp);//这里还有也看一下<br>fclose(fp);<br>printf("b=%d\n",b); <br>}<br></div>
</div>
<div style="color: #040000;">
<div><a><img alt="" src="http://www.ad0.cn/netfetch/images/icon_quote.gif" border="0"></a><a href="http://www.ad0.cn/netfetch/member.asp?action=view&amp;memName=NetFetch"><strong> <u>NetFetch</u></strong> </a>C++面试题集(最全的C\C++试题集和部分<strong style="background-color: #ffff66;">答案</strong>) [2006-07-06 09:19 AM]</div>
<div>c/c++面试题集锦 2006-7-6更新<br><br>12.请完成以下题目。注意，请勿直接调用 ANSI C 函数库中的函数实现。<br><br>a)请编写一个 C 函数，该函数给出一个字节中被置 1 的位的个数，并请<br>给出该题的至少一个不同解法。<br>b)请编写一个 C 函数，该函数将给定的一个字符串转换成整数。<br>c)请编写一个 C 函数，该函数将给定的一个整数转换成字符串。<br>d)请编写一个 C 函数，该函数将一个字符串逆序。<br>e)请编写一个 C 函数，该函数在给定的内存区域搜索给定的字符，并返回<br>该字符所在位置索引值。<br>f)请编写一个 C 函数，该函数在一个字符串中找到可能的最长的子字符串，<br>该字符串是由同一字符组成的。<br><br>给出演示上述函数功能的一个简单程序，并请编写对应的 Makefile 文件<br><br>13.我们需要编写一个图形相关的应用程序，需要处理大量图形(Shape)信息，<br>图形有矩形(Rectangle)，正方形(Square)，圆形 (Circle)等种类，应用<br>需要计算这些图形的面积，并且可能需要在某个设备上进行显示(使用在标准<br>输出上打印信息的方式做为示意)。<br><br>a)请用面向对象的方法对以上应用进行设计，编写可能需要的类<br>b)请给出实现以上应用功能的示例性代码，从某处获取图形信息，<br>并且进行计算和绘制<br>c)如果你的Square继承自Rectangle，请给出理由，如果不是，<br>请给出理由，并且请比较两种方式的优劣<br>d)请问你所编写的类，在如下代码中会有何表现，请解释<br>void test_rectangle_area(Rectangle&amp; r)<br>{<br>r.set_width(10);<br>r.set_height(15);<br>assert(r.area() == 150);<br>}<br>14.假设现有一个单向的链表，但是只知道只有一个指向该节点的指针p，并且假设这个节点不是尾节点，试编程实现删除此节点<br>15.写一个程序，把一个100以内的自然数分解因数。（自然数分解因数就是将一个自然数分解为几个素数的乘积，提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计算速度)<br>16.编写一个Identify的分配、释放的函数，为1－10000之间的自然数。<br>17.分别实现itoa和atoi.<br></div>
</div>
<div style="color: #040000;"><a><img alt="" src="http://www.ad0.cn/netfetch/images/icon_quote.gif" border="0"></a><a href="http://www.ad0.cn/netfetch/member.asp?action=view&amp;memName=NetFetch"><strong> <u>NetFetch</u></strong> </a>C++面试题集(最全的C\C++试题集和部分<strong style="background-color: #ffff66;">答案</strong>) [2006-07-06 09:18 AM]</div>
<div style="color: #040000;"><strong> c/c++面试题集锦 2006-7-6更新</strong> <br><br>1.多态类中的虚函数表是Compile-Time，还是Run-Time时建立的?<br>2.将一个 1M -10M 的文件，逆序存储到另一个文件，就是前一个文件的最后一个 <br>字符存到新文件的第一个字符，以此类推。<br>3.main主函数执行完毕后，是否可能会再执行一段代码?<br>4.一个父类写了一个virtual 函数，如果子类覆盖它的函数不加virtual ,也能实现多态?<br>在子类的空间里，有没有父类的这个函数，或者父类的私有变量?<br>5.给一个字符串、例如 &#8220;ababc&#8221;要求返回&#8220;ab&#8221;. 因为&#8220;ab&#8221;连续重复出现且最长。<br>用C/C＋＋语言写一函数完成该算法，给出复杂度<br>6.对序列1、1、2、3、5、8、13。。。。 是Fab..数列<br>2、3、5、13...是Fab..质数数列，因为他们与自己前面的Fab...数列都互质<br>给出k，返回第k小的Fab..质数<br>7.101个硬币100真、1假，真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。<br>8.完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数，请问这些函数有什么区别，你喜欢使用哪个，为什么？<br>9.变量的声明和定义有什么区别？<br>10.请写出下面代码在 32 位平台上的运行结果，并说明 sizeof 的性质：<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br><br>int main(void)<br>{<br>char a[30];<br>char *b = (char *)malloc(20 * sizeof(char));<br>printf("%d\n", sizeof(a));<br>printf("%d\n", sizeof(b));<br>printf("%d\n", sizeof(a[3]));<br>printf("%d\n", sizeof(b+3));<br>printf("%d\n", sizeof(*(b+4)));<br>return 0 ;<br>}</div>
<br style="color: #040000;"><br></span><img src ="http://www.cppblog.com/KevinYang/aggbug/31347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-09-01 02:24 <a href="http://www.cppblog.com/KevinYang/articles/31347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【经验分享】QT的安装使用,与VC的集成</title><link>http://www.cppblog.com/KevinYang/articles/28333.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Wed, 18 Jul 2007 20:57:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/28333.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/28333.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/28333.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/28333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/28333.html</trackback:ping><description><![CDATA[一下载QT3.3.2版本的windows安装包<br>可以在我们学校的FTP上下到<br>ftp://211.68.71.81/newmirror/pub/Develop/Qt/Trolltech.Qt.Enterprise.v3.3.2-ROR.zip<br>版本不是最新的,但是也已经够用了.里面自带了一个liciense,安装的时候读取就可以了.<br>安装一般不会有问题.在安装的过程中会提示你是否集成到IDE中,这时候看你用的是什么IDE了<br>勾上对应的就行了.<br>二.测试是否安装成功<br>新建一个目录hello,创建hello.cpp<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">QApplication</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">QLabel</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">argv)&nbsp;{<br></span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;QApplication&nbsp;app(argc,&nbsp;argv);<br></span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;QLabel&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">label&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;QLabel(</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello&nbsp;QT&nbsp;World!</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br></span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;label</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">show();<br></span><span style="color: #008080;">8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;app.exec();<br></span><span style="color: #008080;">9</span>&nbsp;<span style="color: #000000;">}</span></div>
这个一个最简单的QT应用,然后我们从命令行下进入该目录<br><span style="background-color: #c0d0ff;">&gt;qmake -project&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  (这个命令会生成一个qt的工程文件,默认名字是目录名)<br>&gt;qmake &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp; (生成Makefile文件,用于编译链接时用)<br>&gt;nmake&nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp; (VS的编译器,按照Makefile进行编译链接,生成exe文件)</span><br>如果没有问题那么在目录下面将会生成一个hello.exe的文件,运行.<br><br>我们也可以使用如下命令生成vc的工程文件,即.dsp文件<br>&gt;qmake -tp vc hello.pro&nbsp;&nbsp;  &nbsp;&nbsp;  (根据qt工程文件生成vc工程文件)<br>打开hello.dsp,进入vc6,选择菜单Tools-&gt;Customize..-&gt;Add-ins and Macro Files勾选上qt的插件<br>然后现在我们也可以在vc6中直接编译运行了.<br><br>除了命令行方式,我们也可以采用其自带的工具栏上的New QT Project的功能,直接在IDE中进行qt的开发.<br>细节省略.<br>注意一个问题,如果我们是利用了vc6的New Project(不是qt的New Project),然后生成一个win32的工程的话,也可以用来编写qt程序.源代码编写方式一样,只需要在qt工具栏上点击"应用QT到当前工程",然后重启IDE即可在当前工程中使用qt了.不过如果程序中运用到了Q_OBJECT这样的宏的时候,由于qt的元编程特性,使到vc6在链接的时候会出现错误.错误信息可能如下<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">main.obj&nbsp;:&nbsp;</span><span style="color: #0000ff;">error</span><span style="color: #000000;">&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;</span><span style="color: #000000;"></span><span style="color: #000000;">..qt_property(int,int,class&nbsp;QVariant&nbsp;*)</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;(?qt_property@MyWidget@@UAE_NHHPAVQVariant@@@Z)<br>main.obj&nbsp;:&nbsp;</span><span style="color: #0000ff;">error</span><span style="color: #000000;">&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;</span><span style="color: #000000;"></span><span style="color: #000000;">..qt_emit(int,struct&nbsp;QUObject&nbsp;*)</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;(?qt_emit@MyWidget@@UAE_NHPAUQUObject@@@Z)<br>main.obj&nbsp;:&nbsp;</span><span style="color: #0000ff;">error</span><span style="color: #000000;">&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol</span><span style="color: #000000;">.qt_invoke(int,struct&nbsp;QUObject&nbsp;*)</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;(?qt_invoke@MyWidget@@UAE_NHPAUQUObject@@@Z)<br>main.obj&nbsp;:&nbsp;</span><span style="color: #0000ff;">error</span><span style="color: #000000;">&nbsp;LNK2001:&nbsp;unresolved&nbsp;external&nbsp;symbol&nbsp;</span><span style="color: #000000;"></span><span style="color: #000000;">..qt_cast(char&nbsp;const&nbsp;*)</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;(?qt_cast@MyWidget@@UAEPAXPBD@Z)<br></span></div>
这个时候就还是得用命令行的方式才产生一个vc工程文件,在产生的过程中,nmake会根据Makefile文件自动调用moc元对象解释器,将qt宏代码转换成标准C++代码,这时候你再打开工程,会发现多了一些moc_前缀的文件,那些就是经过moc解释过的.再编译链接就没错了.<br><br><br><br><br><br><br> <img src ="http://www.cppblog.com/KevinYang/aggbug/28333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-07-19 04:57 <a href="http://www.cppblog.com/KevinYang/articles/28333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】唯一可译码与即时码的判决</title><link>http://www.cppblog.com/KevinYang/articles/28329.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Wed, 18 Jul 2007 18:11:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/28329.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/28329.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/28329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/28329.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/28329.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 专业课上要求做的一个小程序,练练STL编程挺好的该程序比上次增加了另外一个回溯算法,可以在当遇到非唯一可译码码字序列时返回有歧义的序列,即一个序列可以有多种译法./**//**//************************************************************************//**//*&nbsp;唯一可译码和即时码的判决/*&nbsp;完...&nbsp;&nbsp;<a href='http://www.cppblog.com/KevinYang/articles/28329.html'>阅读全文</a><img src ="http://www.cppblog.com/KevinYang/aggbug/28329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-07-19 02:11 <a href="http://www.cppblog.com/KevinYang/articles/28329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】信道容量的迭代算法实现</title><link>http://www.cppblog.com/KevinYang/articles/28328.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Wed, 18 Jul 2007 18:09:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/28328.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/28328.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/28328.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/28328.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/28328.html</trackback:ping><description><![CDATA[<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; font-size: 8pt; width: 97.5%; cursor: text; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4; max-height: 200px;">
<div style="border-style: none; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;">
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">   1:</span> #include <iostream></iostream></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">   2:</span> #include <vector></vector></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">   3:</span> #include <cfloat></cfloat></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">   4:</span> #include <cmath></cmath></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">   5:</span> <span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">   6:</span> &nbsp;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">   7:</span> <span style="color: #cc6633;">#define</span> FLOAT_MINUS_PRECISION 0.00001</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">   8:</span> typedef vector&lt;<span style="color: #0000ff;">float</span>*&gt; VEC_PFLOAT;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">   9:</span> &nbsp;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  10:</span> <span style="color: #008000;">//迭代计算信道容量,参数值为信源,信宿符号个数和信道转移概率矩阵,返回信道容量</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  11:</span> <span style="color: #0000ff;">float</span> GetCapacity(<span style="color: #0000ff;">int</span> nSourceSymbol,<span style="color: #0000ff;">int</span> nHostSymbol,<span style="color: #0000ff;">const</span> VEC_PFLOAT&amp; vTransMatrix)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  12:</span> {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  13:</span>     <span style="color: #008000;">//信道容量初始化为最小值</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  14:</span>     <span style="color: #0000ff;">float</span> fCapacity = FLT_MIN;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  15:</span>     <span style="color: #008000;">//信源概率分布</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  16:</span>     <span style="color: #0000ff;">float</span> *pfSoureProb = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">float</span>[nSourceSymbol];</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  17:</span>     <span style="color: #008000;">//初始化信源分布为均匀分布</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  18:</span>     <span style="color: #0000ff;">int</span> i;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  19:</span>     <span style="color: #0000ff;">for</span> (i = 0; i &lt; nSourceSymbol; i++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  20:</span>     {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  21:</span>         pfSoureProb[i] = 1.0 / nSourceSymbol;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  22:</span>     }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  23:</span>     <span style="color: #008000;">//初始化&#966;函数</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  24:</span>     VEC_PFLOAT vPhi;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  25:</span>     <span style="color: #0000ff;">for</span> (i = 0; i &lt; nSourceSymbol; i++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  26:</span>     {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  27:</span>         <span style="color: #0000ff;">float</span> *pfTemp = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">float</span>[nHostSymbol];        </pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  28:</span>         vPhi.push_back(pfTemp);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  29:</span>     }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  30:</span>     <span style="color: #008000;">//设置精度;</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  31:</span>     <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">float</span> cfDelta = 0.02f;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  32:</span>     <span style="color: #0000ff;">float</span> fPrecision;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  33:</span>     <span style="color: #008000;">//迭代计算</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  34:</span>     <span style="color: #0000ff;">int</span> j,k;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  35:</span>     <span style="color: #0000ff;">float</span> *pfSum = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">float</span>[nSourceSymbol];</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  36:</span>     <span style="color: #0000ff;">do</span> </pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  37:</span>     {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  38:</span>         <span style="color: #0000ff;">for</span> (i = 0; i &lt; nSourceSymbol; i++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  39:</span>         {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  40:</span>             <span style="color: #0000ff;">for</span> (j = 0; j &lt; nHostSymbol; j++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  41:</span>             {                </pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  42:</span>                 <span style="color: #008000;">//计算&#931;Pi*Pji</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  43:</span>                 <span style="color: #0000ff;">float</span> fSum = 0.0f;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  44:</span>                 <span style="color: #0000ff;">for</span> (k = 0; k &lt; nSourceSymbol; k++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  45:</span>                 {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  46:</span>                     fSum += pfSoureProb[i] * vTransMatrix[k][i];</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  47:</span>                 }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  48:</span>                 vPhi[i][j] = pfSoureProb[i] * vTransMatrix[j][i] / fSum;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  49:</span>             }            </pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  50:</span>         }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  51:</span>         <span style="color: #0000ff;">float</span> fSumDeno = 0.0f;    <span style="color: #008000;">//分母求和                </span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  52:</span>         <span style="color: #0000ff;">for</span> (i = 0; i &lt; nSourceSymbol; i++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  53:</span>         {        </pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  54:</span>             <span style="color: #0000ff;">float</span> fSum = 0.0f;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  55:</span>             <span style="color: #0000ff;">for</span> (j = 0; j &lt; nHostSymbol; j++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  56:</span>             {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  57:</span>                 fSum += vTransMatrix[j][i] * logf(vPhi[i][j]);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  58:</span>             }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  59:</span>             pfSum[i] = expf(fSum);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  60:</span>             fSumDeno += pfSum[i];</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  61:</span>         }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  62:</span>         <span style="color: #0000ff;">for</span> (i = 0; i &lt; nSourceSymbol; i++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  63:</span>         {            </pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  64:</span>             pfSoureProb[i] = pfSum[i] / fSumDeno;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  65:</span>         }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  66:</span>         <span style="color: #008000;">//计算新一轮的容量</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  67:</span>         <span style="color: #0000ff;">float</span> fNewC = logf(fSumDeno);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  68:</span>         <span style="color: #008000;">//计算精度</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  69:</span>         fPrecision = fabs(fNewC - fCapacity) / fCapacity;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  70:</span>         fCapacity = fNewC;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  71:</span>     } <span style="color: #0000ff;">while</span>(fPrecision - cfDelta &gt; 0.0f);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  72:</span>     <span style="color: #008000;">//释放临时资源...</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  73:</span>     delete []pfSum;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  74:</span>     <span style="color: #0000ff;">for</span> (i = 0; i &lt; vPhi.size(); i++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  75:</span>     {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  76:</span>         <span style="color: #0000ff;">float</span>* pfTemp = vPhi.at(i);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  77:</span>         delete pfTemp;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  78:</span>     }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  79:</span>     vPhi.clear();</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  80:</span>     <span style="color: #0000ff;">return</span> fCapacity;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  81:</span> }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  82:</span> <span style="color: #0000ff;">int</span> main()</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  83:</span> {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  84:</span>     <span style="color: #008000;">//转移矩阵</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  85:</span>     VEC_PFLOAT vTransMatrix;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  86:</span>     <span style="color: #0000ff;">int</span> nCol,nLine;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  87:</span>     cout&lt;&lt;<span style="color: #006080;">"请输入信源符号个数:"</span>;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  88:</span>     cin&gt;&gt;nLine;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  89:</span>     cout&lt;&lt;<span style="color: #006080;">"请输入信宿符号个数:"</span>;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  90:</span>     cin&gt;&gt;nCol;</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  91:</span>     cout&lt;&lt;<span style="color: #006080;">"请依次输入"</span>&lt;<nline>&lt;&lt;<span style="color: #006080;">"行信道转移概率矩阵:(以空格隔开每个概率)\n"</span>;</nline></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  92:</span>     <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i &lt; nLine; i++)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  93:</span>     {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  94:</span>         <span style="color: #0000ff;">float</span> *pfTemp = <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">float</span>[nCol];</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  95:</span> Label1:</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  96:</span>         <span style="color: #0000ff;">float</span> fSum = 0.0f;    </pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;">  97:</span>         cout&lt;&lt;<span style="color: #006080;">"X"</span>&lt;<em>&lt;&lt;<span style="color: #006080;">":"</span>;</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em>  98:</em></span><em>         <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> j = 0; j &lt; nCol - 1; j++)</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em>  99:</em></span><em>         {</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 100:</em></span><em>             cin&gt;&gt;pfTemp[j];</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 101:</em></span><em>             fSum += pfTemp[j];</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 102:</em></span><em>         }</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 103:</em></span><em>         <span style="color: #0000ff;">if</span> (1.0f - fSum &lt; 0)</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 104:</em></span><em>         {</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 105:</em></span><em>             cout&lt;&lt;<span style="color: #006080;">"转移概率和应该为1,请重新输入!\n"</span>;</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 106:</em></span><em>             <span style="color: #0000ff;">goto</span> Label1;</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 107:</em></span><em>         }</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 108:</em></span><em>         <span style="color: #0000ff;">else</span></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 109:</em></span><em>         {</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 110:</em></span><em>             pfTemp[j] = 1.0f - fSum;</em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em> 111:</em></span><em>             cout&lt;&lt;<span style="color: #006080;">"信源符号X"</span>&lt;<em>&lt;&lt;<span style="color: #006080;">"的转移概率分别为:"</span>;</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 112:</em></em></span><em><em>             <span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> k = 0; k &lt; nCol; k++)</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 113:</em></em></span><em><em>                 cout&lt;</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 114:</em></em></span><em><em>             cout&lt;</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 115:</em></em></span><em><em>         }</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 116:</em></em></span><em><em>         vTransMatrix.push_back(pfTemp);</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 117:</em></em></span><em><em>     }</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 118:</em></em></span><em><em>     cout&lt;&lt;<span style="color: #006080;">"信道容量为:"</span>&lt;</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 119:</em></em></span><em><em>     <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> k = 0; k &lt; vTransMatrix.size(); k++)</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 120:</em></em></span><em><em>     {</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 121:</em></em></span><em><em>         <span style="color: #0000ff;">float</span>* pfTemp = vTransMatrix.at(k);</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 122:</em></em></span><em><em>         delete pfTemp;</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 123:</em></em></span><em><em>     }</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 124:</em></em></span><em><em>     vTransMatrix.clear();</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 125:</em></em></span><em><em>     <span style="color: #0000ff;">return</span> 0;</em></em></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; font-size: 8pt; width: 100%; color: black; line-height: 12pt; font-family: consolas,'Courier New',courier,monospace; background-color: #f4f4f4;"><span style="color: #606060;"><em><em> 126:</em></em></span><em><em> }</em></em></pre>
</div>
</div>
<em><em>算法描述请参照信息论相关理论知识</em></em><img src ="http://www.cppblog.com/KevinYang/aggbug/28328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-07-19 02:09 <a href="http://www.cppblog.com/KevinYang/articles/28328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】C++扫盲系列之--指针专题</title><link>http://www.cppblog.com/KevinYang/articles/28309.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Wed, 18 Jul 2007 11:51:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/28309.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/28309.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/28309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/28309.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/28309.html</trackback:ping><description><![CDATA[<p>本文将讨论如下的内容:<br>1.指针的概念及其本质<br>2.指针的用法<br>3.容易混淆的概念<br>4.善用指针</p>
<p>&nbsp; </p>
<p><font color="#0000ff" face="黑体" size="5"><em><strong>1.指针的本质</strong></em></font> </p>
<h1></h1>
<p>在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器.指针一般出现在比较近机器语言的语言，如汇编语言或C语言。纯面向对象的语言如Java一般避免用指针。指针一般指向一个变量或者函数。在使用一个指针时，一个程序既可以直接使用这个指针所储存的内存地址，又可以使用这个地址里储存的变量或函数的值。 </p>
<p>c语言之所以强大，以及其自由性，很大部分体现在其灵活的指针运用上。因此，说指针是c语言的灵魂，一点都不为过。C++作为从C语言发展而来的一门高级语言,他并没有摒弃指针,而是积极的采纳他.同时又注入了面向对象的高级思想,这使得C++成为了全世界迄今为止最为优秀的语言. </p>
<p>C++中的指针一直被初学者视为很神秘的东西.其实指针的概念很简单.我们可以把他看作一种数据类型,定义一个指针变量就像定义一个int, char型一样的变量.只不过我们往int里面存整数,往char型里面存字符,而往指针里面呢,存放的是地址,内存地址.我们只要记住一点,在高级语言里 </p>
<p>&nbsp;</p>
<p>&nbsp;<a href="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image_3.png" atomicselection="true"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image_thumb_3.png" border="0" height="23" width="240"></a> </p>
<p><strong><em><font color="#0000ff" face="黑体" size="5">2.指针的用法</font></em></strong> </p>
<p>既然我们说指针是一个变量类型,那么在继续深入了解指针之前我们先来了解一下什么叫做变量类型. </p>
<p>我们知道,所有的数据最终都是放到内存中才能被使用,也即是说,所有的数据,不管你是如何定义的,最终都将反映为一段内存空间.那么我们声明为某种变量类型之后有什么用呢?其实有两个用途.一个是限定内存占用大小.一般来说编程语言总要为数据设定不同的内存占用空间以满足不同应用的需求.尤其是在内存吃紧的嵌入式等应用,经常可是要用到bit型的,如果都用4个字节那是省事了,但是带来的空间消耗可是很大的.类型定义的第二个用途是约束操作.例如我 int型的数据可以相乘,但是char型不可以不同的数据类型应该具有不同的操作.所以我们用类型定义来实现这种约束. </p>
<p>所以我们可以看出,指针无非存放的东西有点不同,其余的与其他数据类型没有什么不一样.指针变量本身占用了4个字节的空间来存放内存地址,即可以寻址到2的32次方即4G的内存地址空间.他有两个基本操作符,一个是*号(取地址中存放的值),一个是&amp;(取变量地址). </p>
<p>我们先来看下面这段简单的代码 </p>
<div class="csharpcode">
<pre class="alt"><span class="kwrd">int</span>  aint = 3;</pre>
<pre><span class="kwrd">int</span>* pint;</pre>
<pre class="alt">pint = &amp;aint;</pre>
</div>
<p><style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>当定义了一个int型变量之后,C++会该变量分配一块内存空间,然后把3转换成4个字节初始化这片内存空间.在这里,我们要知道,其实变量名就相当于某个寄存器的别名,也就是地址空间的名字.我们使用这个变量名.就像使用地址空间上面存放的值一样.如果我们要得到aint这个变量的地址,我们可以用 &amp;aint来获得.程序下面又定义了一个指针变量pint,他是用来存放aint变量的内存地址的.那么我们如何使用指针呢?一般来说我们不用到变量的地址,我们更关心的变量的值,即地址中所存的值.我们用*号操作符来获取aint的值.然后输出.</p>
<p>指针和指向的变量之间的关系如下图所示. </p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image_2.png" atomicselection="true"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image_thumb_2.png" border="0" height="74" width="240"></a> </p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image_4.png" atomicselection="true"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image_thumb_4.png" border="0" height="60" width="249"></a> </p>
<p>那么既然指针是一类数据类型,为什么我们不用一种统一的数据类型的名字,例如pointer来定义一个指针变量呢?这是由于指针存放东西的特殊性造成的,指针存放的是内存地址,需要的时候我们可以取出内存地址中的数据来.问题是,我们如何去取这块内存中的数据呢??取两个字节?取四个字节?还有,取出来的数据他有什么操作呢??他可以相乘吗?我们要知道机器是很笨的,他什么都不知道,他只知道我们给他设定的规则. </p>
<p>还记得我们上面说过的数据类型的两大用途吗?用&#8221;基本数据类型 *&#8221;这样一种方式来定义一个指针变量的意义正在于此.机器将按照我们设置的类型(int*)取出aint地址上的四个字节的数据,然后将数据格式化成 int型数据,这样数据的操作就受到约束了.C++中还甚至允许我们定义指针类型为void*型,表明我们暂时只需要指针的首地址,不需要立即对其数据进行格式化. </p>
<p><font color="#804000" face="黑体" size="4"><strong>*函数指针*</strong></font> </p>
<p>指针作为存放地址的变量,那么他自然可以存放任何东西的地址,例如函数.这就是函数指针了.函数指针的声明格式如下: </p>
<p>函数返回值类型（＊指针变量名）（参数类型列表） = &amp;函数 </p>
<p>或者是 </p>
<p>typedef　函数返回值类型　（＊函数类型名）（参数类型列表） </p>
<p>函数类型名 函数指针 = &amp;函数; </p>
<p>我们来看一个典型的应用</p>
<pre class="csharpcode"><span class="kwrd">int</span> getmax(<span class="kwrd">int</span> a,<span class="kwrd">int</span> b)
{
<span class="kwrd">return</span> a &gt; b ? a : b;
}
typedef <span class="kwrd">int</span> (*Func)(<span class="kwrd">int</span>,<span class="kwrd">int</span>);
<span class="kwrd">int</span> main()
{
Func pFuncFormat1 = &amp;getmax;
<span class="kwrd">int</span> (*pFuncFormat2)(<span class="kwrd">int</span>,<span class="kwrd">int</span>) = &amp;getmax;
cout&lt;&lt;(*pFuncFormat1)(3,5);
cout&lt;&lt;(*pFuncFormat2)(3,5);
<span class="kwrd">return</span> 0;
} </pre>
<p><style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>上面这段代码首先定义了一个普通的比较大小的函数,然后在主函数中以两种风格定义了两个同样的函数指针,指向该函数.这样我们就在这个函数指针中存放了GetMax函数的入口地址了,注意这里跟普通的变量有些不一样.对GetMax函数用不用&amp;号都是可以的,在使用时用不用*号也是可以的,效果是一样的.但是习惯上我们会采用上面这种风格来写程序代码比较好懂一点.还有要注意的是,函数指针一定要与函数声明的签名(也就是参数表) 一致,还有返回值也要一致.</p>
<p><font color="#0000ff" face="黑体" size="5"><strong><em>3.容易混淆的概念</em></strong></font></p>
<p><font color="#804000" face="黑体" size="4"><strong>**指针数组和数组指针的区别</strong></font> </p>
<p>这个也是C++里面比较容易混淆的一个定义. </p>
<p>你能看出下面的定义有什么区别吗? </p>
<p>1.int *PointerArray[3]; </p>
<p>2.int (*ArrayPointer)[3]; </p>
<p>1中定义的是一个指针数组.首先让我们先来了解一下什么叫做数组.数组就是同一类型元素的聚合.例如int array[3];定义了3个int型元素,并将其聚合在array这个数据结构中.数组本质上也是指针.即array变量本身存放的是上面这个数据结构的首地址.当我们用[]索引符号去访问数组对象时,其实就相当于调用指针操作符*取地址上的数据(注意,指针也可以应用[]索引符,或者数组"名"也可以应用*操作符,这也再一次说明了数组和指针具有一定的关系).那数组和指针有什么不同呢?我们说数组是一种常指针(关于常指针和指针常量我们待会再解释).了解到这一点之后我们再来看下指针数组是什么东西就很好理解了.指针数组说白了就是存放指针变量的数组.我们可以把int* 看作一种新类型,和int,char等基本类型等价的一种类型,然后再去看上面这个例子就很清楚了. </p>
<p>字符型的指针数组一般用于字符串操作较多.例如我们可以这样定义 </p>
<p>char *PointerArray[3] = {"Hello","World","!"} </p>
<p>三个指针分别指向了三个字符串,长度不相等.但要注意,这里定义之后每个指针就变成了指针常量了.即通过该指针对这些字符串进行修改是非法的.一般的用法是 </p>
<p>PointerArray[i] = new char[N]; (N为常数) </p>
<p>然后再进行赋值操作. </p>
<p>再来解释数组指针.数组指针其实就是指向数组的指针,定义中的下标号3表示的是该指针所指向的一维数组的长度(注意,任意维数组都可以看成是由一维数组构成的).我们来看下面的例子 </p>
<p>int array[3][5]; </p>
<p>int (*ArrayPointer)[5]; </p>
<p>ArrayPointer = array; </p>
<p>然后我们就可以像使用array数组一样使用ArrayPointer了.如果记不住的话我们可以将上面的定义分开来看.把他看成(*ArrayPointer)和int [5]两部分,如下图所示: </p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image.png" atomicselection="true"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image_thumb.png" border="0" height="92" width="240"></a> <a href="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image_1.png" atomicselection="true"><img style="border-width: 0px;" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/KevinYang/WindowsLiveWriter/c_2AE6/image_thumb_1.png" border="0" height="116" width="240"></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<font color="#ff8000" face="黑体" size="3"><strong>(数组指针)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (指针数组)</strong></font> </p>
<p>注意,是(*ArrayPointer)才相当于int [5],而不是ArrayPointer,所以我们可以用(*ArrayPointer)[3]来访问array[0][3].或者用 (*ArrayPointer+1)[3]来访问array[1][3].当然也可以像二维数组那样直接用两个索引号来访问. </p>
<p>数组指针一般用于动态分配二维数组,如下 </p>
<p>char (*CharArray)[5] = new char[N][5]; (N为常数) </p>
<p>注意,二维数组动态分配时必须指定他的一维长度. </p>
<p><font color="#804000" face="黑体" size="4">**常指针和指针常量的区别</font> </p>
<p>常指针就像我们平时说常整数一样,意思是指针的内容不能再被修改了.而我们知道指针内存放的是变量的地址,也就是说一旦将某变量的地址赋值给了该指针,那么以后就不能将其指向其他的变量了.他的定义如下:</p>
<pre class="csharpcode">type * <span class="kwrd">const</span> PointerName = &amp;Variable;</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>对于常量必须在声明时即初始化,除非是类的数据成员,那么可以在构造函数的时候才进行初始化,如下面</p>
<pre class="csharpcode"><span class="kwrd">class</span> Test
{
<span class="kwrd">const</span> <span class="kwrd">int</span> c;
<span class="kwrd">public</span>:
Test(<span class="kwrd">int</span> x):c(x){}
};
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>指针常量比较难从字面上理解其意思.我们只好记住他了,他表示的是指针所指向的内容是不能通过指针来修改的(虽然通过一些小伎俩是可以进行"不合法"修改的). </p>
<p>他的定义方式有两种</p>
<pre class="csharpcode">type <span class="kwrd">const</span> * PointerName = &amp;Variable;
<span class="kwrd">const</span> type * PointerName = &amp;Variable;</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>下面的例子中试图对指针常量进行修改将编译失败</p>
<pre class="csharpcode"><span class="kwrd">char</span> Variable = <span class="str">'3'</span>;
<span class="kwrd">char</span> <span class="kwrd">const</span> * PointerName;
PointerName = &amp;Variable;
//*PointerName = <span class="str">'4'</span>; //编译不通过</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>与常指针不同的是指针常量允许声明和赋值分开. </p>
<p><font color="#804000" face="黑体" size="4"><strong>**指针与引用的区别</strong></font> </p>
<p>引用就像是变量的别名一样.他的定义如下:</p>
<pre class="csharpcode"><span class="kwrd">int</span> Variable;
<span class="kwrd">int</span> &amp;Ref = Variable;
</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>我们可以看到,引用使用指针里的取地址符作为标识,他表示引用与变量使用的是同一块内存的数据.引用和指针有几个不同的地方,一个就是引用必须声明即赋初值,而且不能再引用其他的变量了.而指针是可以随时指向其他变量的(常指针除外).既然引用就像别名一样,那么为什么我们还需要这个东西呢?引用一般是用于传递参数的比较多,这样可以节省内存和拷贝构造函数等的开销. </p>
<p><strong><em><font color="#0000ff" face="黑体" size="5">4.善用指针</font></em></strong> </p>
<p>指针是操作底层必备的东西,是C++里面最为灵活的东西.但也带来安全性的问题.不正确的使用指针将会导致内存泄露,内存悬挂,野指针(不安全指向)等问题的出现,严重威胁到软件系统的稳定性和安全性.现在有很多人在致力于编写智能指针的库,使用智能指针,我们将可以在很大程度上避免上述的问题. 如boost库中就设计了智能指针,具体请参考相关的内容. </p><img src ="http://www.cppblog.com/KevinYang/aggbug/28309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-07-18 19:51 <a href="http://www.cppblog.com/KevinYang/articles/28309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>