﻿<?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>IT博客-爱我所爱,执著追求-随笔分类-编程学习</title><link>http://www.cnitblog.com/Michael/category/3509.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 04 Oct 2011 17:50:12 GMT</lastBuildDate><pubDate>Tue, 04 Oct 2011 17:50:12 GMT</pubDate><ttl>60</ttl><item><title>网站完工发贴总结</title><link>http://www.cnitblog.com/Michael/archive/2007/05/17/27160.html</link><dc:creator>专业专注</dc:creator><author>专业专注</author><pubDate>Thu, 17 May 2007 11:40:00 GMT</pubDate><guid>http://www.cnitblog.com/Michael/archive/2007/05/17/27160.html</guid><wfw:comment>http://www.cnitblog.com/Michael/comments/27160.html</wfw:comment><comments>http://www.cnitblog.com/Michael/archive/2007/05/17/27160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Michael/comments/commentRss/27160.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Michael/services/trackbacks/27160.html</trackback:ping><description><![CDATA[　　其实在上个星期网站就已经大部分完工了，只是因为网站资料收集不齐有些网页一直没法添加完成。<br>现在大致总结一下这个小网站的一些经验：<br>1. CSS的运用：幸好听一朋友介绍使用了ＣＳＳ来定义网站边框和一些字体，否则在后来修改网站的时候不知道要花多少功夫。此外，如果文字不使用ＣＳＳ的话，调整浏览器中文字查看大小会使网页变形。<br>2.表格的运用：在本质上，表格、标准视图和布局视图中的边框等都是一致的，只是相对表现方式不同。还有就是百分号对表格的表示方法也比较有作用。另外表格的拖动有时比较艰苦，具体原因还未查明。<br>3.flash的插入与图片插入方法大致一致，只需要在网页中调整大小即可，并不需要原文件大小有何要求（当然最好比例一致）。<br>4.网站颜色布局：现在总结起来网站颜色不能过于花哨，特别是对于商业宣传网站而言，太花哨了反而让人有一种说不出的感觉。<br>5.网站的发布：应该说使用CuteFtp或FlashXp是比较好的工具，可是因为没下载到这两种软件就直接用了浏览器的ftp功能。因为网站比较小，上传速度也还不错。<br>网站基本实现了他们所需要的功能，网址<a href="http://www.hyrf.com.cn/">http://www.hyrf.com.cn</a> 有兴趣的朋友可登陆看看一起交流。<br>
<img src ="http://www.cnitblog.com/Michael/aggbug/27160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Michael/" target="_blank">专业专注</a> 2007-05-17 19:40 <a href="http://www.cnitblog.com/Michael/archive/2007/05/17/27160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DreamWeaver制作网页小结</title><link>http://www.cnitblog.com/Michael/archive/2007/05/06/26693.html</link><dc:creator>专业专注</dc:creator><author>专业专注</author><pubDate>Sun, 06 May 2007 15:34:00 GMT</pubDate><guid>http://www.cnitblog.com/Michael/archive/2007/05/06/26693.html</guid><wfw:comment>http://www.cnitblog.com/Michael/comments/26693.html</wfw:comment><comments>http://www.cnitblog.com/Michael/archive/2007/05/06/26693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Michael/comments/commentRss/26693.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Michael/services/trackbacks/26693.html</trackback:ping><description><![CDATA[　　因为要为帮一公司制作一个小型的外部网站,所以不得不学习一下用DreamWeaver制作网页，通过今天的学习大致可以制作一个不错的对外宣传的网站了。现总结如下：<br>1. 设计好网站布局<br>&nbsp;&nbsp;&nbsp;&nbsp; 注意布局中标准视图和布局视图的切换，标准视图用于编辑修改等，而布局视图用于对网站格局修改。布局视图中布局表格和应用和布局单元格的应用。<br>&nbsp;&nbsp;&nbsp;&nbsp;技巧：按住Alt健防止靠边，按住CTRL健可同时画多个布局单元格。在布局视图中选中要复制的表格，然后切换至标准视图下点击table再复制，可一次复制多个单元格。<br>&nbsp;2.使用include结构化网页<br>&nbsp;&nbsp;&nbsp;虽然可以直接使用复制的方法来增加站内网页，但这种方式结构化相当不好，如果要修改某一个部分时需要将所有的网页逐一修改。使用&lt;!--#include="test.asp"--&gt;的方式类似于程序中的函数调用，便于今后修改，但应注意的是如果是框架结构的调用应注意被调用的asp页只要含有table标记部分，如果将body或html部分包括则会出现问题。<br>&nbsp;&nbsp;&nbsp; 使用结构化的方法更进一步的突出了布局的重要性，因此在网站开始之前布局就应当做好。<br>3.使用下载代码增加横向和纵向的文字或图片滚动。<br>4.使用下载的代码横向滚动文字，最好单独的用一个单元格。<br>5.使用下载的代码显示日期、星期、农历等，最好单独用一个单元格。<br>6.可以直接添加swf至网站中，可以增加一些渐变的图案来修饰网站边框以增加网站美观度。背景的使用。<br>7.在&lt;head&gt;与&lt;/head&gt;之间增加<br>&lt;style&gt;<br>a{text-decoration:none}<br>&lt;/style&gt;&nbsp; 可以消除所有的超链结的下划线。<br><br>还需要马上弄清楚的几个问题：<br>1.数据库的连接<br>2.布局框架的中间添加与删除
<img src ="http://www.cnitblog.com/Michael/aggbug/26693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Michael/" target="_blank">专业专注</a> 2007-05-06 23:34 <a href="http://www.cnitblog.com/Michael/archive/2007/05/06/26693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指针学习详解</title><link>http://www.cnitblog.com/Michael/archive/2006/08/05/14761.html</link><dc:creator>专业专注</dc:creator><author>专业专注</author><pubDate>Sat, 05 Aug 2006 07:15:00 GMT</pubDate><guid>http://www.cnitblog.com/Michael/archive/2006/08/05/14761.html</guid><wfw:comment>http://www.cnitblog.com/Michael/comments/14761.html</wfw:comment><comments>http://www.cnitblog.com/Michael/archive/2006/08/05/14761.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/Michael/comments/commentRss/14761.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Michael/services/trackbacks/14761.html</trackback:ping><description><![CDATA[<h1>Visual C++初学者指针学习详解指南</h1>
<div style="COLOR: #999999">所属类别：VC++<br>推荐指数：★★★☆<br>文档人气：402<br>本周人气：34<br>发布日期：2006-6-25</div>
<div>　　<strong>何为指针？</strong><br><br>　　指针基本上和其它的变量一样，唯一的一点不同就是指针并不包含实际的数据，而是包含了一个指向内存位置的地址，你可以在这个地址找到某些信息。这是一个很重要的概念，并且许多程序或者思想都是将指针作为它们的设计基础，例如链表。<br><br>　　 <strong>开始</strong><br><br>　　如何定义一个指针？呃，就像定义其它的变量一样，不过你还需要在变量名之前添加一个星号。例如，下面的代码创建了两个指向整数的指针： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　int* pNumberOne; <br><br>　　 int* pNumberTwo; </td>
        </tr>
    </tbody>
</table>
<br>　　注意到变量名的前缀&#8220;p&#8221;了吗？这是编写代码的一个习惯，用来表示这个变量是一个指针。 <br><br>　　现在，让我们把这些指针指向一些实际的值吧： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　pNumberOne = &amp;some_number; <br><br>　　 pNumberTwo = &amp;some_other_number; </td>
        </tr>
    </tbody>
</table>
<br>　　 &#8220;&amp;&#8221;标志应该读作&#8220;the address of(&#8230;&#8230;的地址)&#8221;，它的作用是返回一个变量的内存地址，而不是这个变量本身。那么在这个例子中，pNumberOne就是some_number的地址，亦称作pNumberOne指向some_number。 <br><br>　　现在，如果我们想使用some_number的地址的话，那么我们就可以使用pNumberOne了。如果我们希望经由pNumberOne而使用some_number的值的话，我们可以用*pNumberOne。&#8220;*&#8221;应该读作&#8220;the memory location pointed to by(由&#8230;&#8230;指向的内存位置)&#8221;，它用来取得指针所指向的值。不过指针声明的情况例外，如&#8220;int *pNumber&#8221;。<br><br>　　 <strong>到现在都学到什么了(一个例子)</strong>：<br><br>　　咻！要理解的东西太多了，所以在此我建议，如果你还是不理解以上的概念的话，那么最好再通读一遍；指针是一个复杂的主题，要掌握它是要花些时间的。 <br><br>　　这里有一个示例，解说了上面讨论的那些概念。它是由C编写成，并不带有C++的那些扩展。 <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　#include <br><br>　　 void main() <br><br>　　 { <br><br>　　 // 声明变量： <br><br>　　 int nNumber; <br><br>　　 int *pPointer; <br><br>　　 // 现在，给它们赋值： <br><br>　　 nNumber = 15; <br><br>　　 pPointer = &amp;nNumber; <br><br>　　 // 打印nNumber的值： <br><br>　　 printf("nNumber is equal to : %d\n", nNumber); <br><br>　　 // 现在，通过pPointer来控制nNumber： <br><br>　　 *pPointer = 25; <br><br>　　 // 证明经过上面的代码之后，nNumber的值已经改变了： <br><br>　　 printf("nNumber is equal to : %d\n", nNumber); <br><br>　　　 } </td>
        </tr>
    </tbody>
</table>
<br>　　请通读并编译以上代码，并确信你已经弄懂了它是如何工作的。然后，当你准备好了以后，就往下读吧！<br><br>　　 <strong>陷阱！</strong><br><br>　　看看你是否能指出以下程序的缺陷： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　#include <br><br>　　 int *pPointer; <br><br>　　 void SomeFunction() <br><br>　　 { <br><br>　　 int nNumber; <br><br>　　 nNumber = 25; <br><br>　　 // 使pPointer指向nNumber： <br><br>　　 pPointer = &amp;nNumber; <br><br>　　 } <br><br>　　 void main() <br><br>　　 { <br><br>　　 SomeFunction(); // 让pPointer指向某些东西 <br><br>　　 // 为什么这样会失败？ <br><br>　　 printf("Value of *pPointer: %d\n", *pPointer); <br><br>　　 } </td>
        </tr>
    </tbody>
</table>
<p><br>这个程序首先调用SomeFunction函数，在其中创建了一个名为nNumber的变量，并且使pPointer指向这个变量。那么，这就是问题之所在了。当函数结束的时候，由于nNumber是一个本地变量，那么它就会被销毁。这是因为当语句块结束的时候，块中定义的本地变量都会被销毁。这就意味着当SomeFunction返回到main()的时候，那个变量就已经被销毁了，所以pPointer将会指向一个不再属于本程序的内存位置。如果你不懂这一点，那么你应该去读一读有关本地变量、全局变量以及作用域的东西，这些概念非常重要。 <br><br>那么，如何解决这个问题呢？答案是使用一种名为动态分配的技术。请注意：在这一点上，C和C++是不同的。既然大多数开发者正在使用C++，那么下面的代码就使用C++来编写。</p>
<p>　　<strong>动态分配</strong><br><br>　　 动态分配也许可以算是指针的关键技术了。它被用于在没有定义变量的情况下分配内存，然后由一个指针指向这段内存。虽然这个概念好像很让人糊涂，其实它很简单。以下的代码解说了如何为一个整数分配内存空间： <br><br></p>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　int *pNumber; <br><br>　　 pNumber = new int; </td>
        </tr>
    </tbody>
</table>
<br>　　第一行代码声明了一个指针pNumber，第二行代码分配了一个整数的空间，并使pNumber指向这一段新分配的内存。下面是另外一个例子，这一次使用了一个double： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　double *pDouble; <br><br>　　 pDouble = new double; </td>
        </tr>
    </tbody>
</table>
<br>　　这些规则是相同的T，所以你应该可以很容易地掌握。 <br><br>　　动态分配和本地变量的不同点是：你分配的内存在函数返回和语句块结束的时候不会被释放，所以，如果你用动态分配来重新编写上面的代码，那么它就会正常工作了： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　#include <br><br>　　 int *pPointer; <br><br>　　 void SomeFunction() <br><br>　　 { <br><br>　　 // 使pPointer指向一个new的整数 <br><br>　　 pPointer = new int; <br><br>　　 *pPointer = 25; <br><br>　　 } <br><br>　　 void main() <br>　　 { <br>　　　 SomeFunction(); // 让pPointer指向某些东西 <br>　　　 printf("Value of *pPointer: %d\n", *pPointer); <br>　　 } </td>
        </tr>
    </tbody>
</table>
<br><br>　　请通读并编译以上的示例代码，并确信你已经弄懂了它为何如此工作。当调用SomeFunction的时候，它分配了一段内存，并使pPointer指向这段内存。这一次当函数返回的时候，这段new的内存就会完好保留，所以pPointer仍然指向某些有用的内容。这就是动态分配了！请确信你已经搞懂了这一点，然后继续阅读关于这段代码中的一个严重错误。<br><br>　　 <strong>来得明白，去得明白</strong><br><br>　　还有一个复杂的因素，并且是十分严重的——虽然它很好补救。问题是你分配的内存在离开的时候虽然仍然完好，但是这段内存永远也不会自动销毁。这就是说，如果你不通知电脑结束使用的话，这段内存就会一直存在下去，这样做的结果就是内存的浪费。最终，系统就会因为内存耗尽而崩溃。所以，这是相当重要的一个问题。当你使用完内存之后，释放它的代码非常简单： <br><br>　　 delete pPointer; <br><br>　　这一切就这么简单。不管怎样，在你传递一个有效的指针——亦即一个指向一段你已经分配好的内存指针，而不是那些老旧的垃圾内存——的时候，你都需要无比细心。尝试delete一段已经释放的内存是十分危险的，这可能会导致你的程序崩溃。 <br><br>　　好了，下面又是那个例子，这一次它就不会浪费内存了： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　#include <br><br>　　 int *pPointer; <br><br>　　 void SomeFunction() <br><br>　　 { <br><br>　　 // 使pPointer指向一个new的整数 <br><br>　　 pPointer = new int; <br><br>　　 *pPointer = 25; <br><br>　　 } <br><br>　　 void main() <br><br>　　 { <br><br>　　 SomeFunction(); // 让pPointer指向某些东西 <br><br>　　 printf("Value of *pPointer: %d\n", *pPointer); <br><br>　　 delete pPointer; <br><br>　　 } </td>
        </tr>
    </tbody>
</table>
<p><br>唯一的一行不同也就是最本质的一点。如果你不将内存delete掉，你的程序就会得到一个&#8220;内存泄漏&#8221;。如果出现了内存泄漏，那么除非你关闭应用程序，否则你将无法重新使用这段泄漏的内存。</p>
<p>　　<strong>向函数传递指针</strong><br><br>　　 向函数传递指针的技术非常有用，但是它很容易掌握(译注：这里存在必然的转折关系吗？呃，我看不出来，但是既然作者这么写了，我又无法找出一个合适的关联词，只好按字面翻译了)。如果我们要编写一段程序，在其中要把一个数增加5，我们可能会像这么写： <br><br></p>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　#include <br><br>　　 void AddFive(int Number) <br><br>　　 { <br><br>　　 Number = Number + 5; <br><br>　　 } <br><br>　　 void main() <br><br>　　 { <br><br>　　 int nMyNumber = 18; <br><br>　　 printf("My original number is %d\n", nMyNumber); <br><br>　　 AddFive(nMyNumber); <br><br>　　 printf("My new number is %d\n", nMyNumber); <br><br>　　 } </td>
        </tr>
    </tbody>
</table>
<br>　　可是，这段程序AddFive中的Number是传递到这个函数中的nMyNumber的一份拷贝，而不是nMyNumber本身。因此，&#8220;Number = Number + 5&#8221;这一行则是向这份拷贝加上了5，而main()中的原始变量并没有任何变化。你可以运行这个程序试着证明这一点。 <br><br>　　对于这个程序，我们可以向函数传递这个数字内存地址的指针。这样，我们就需要修改这个函数，使之能接收一个指向整数的指针。于是，我们可以添加一个星号，即把&#8220;void AddFive(int Number)&#8221;改为&#8220;void AddFive(int* Number)&#8221;。下面是这个修改过了的程序，注意到我们已经将nMyNumber的地址(而不是它本身)传递过去了吗？此处改动是添加了一个&#8220;&amp;&#8221;符号，它读作(你应该回忆起来了)&#8220;the address of(&#8230;&#8230;的地址)&#8221;。 <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　#include <br><br>　　 void AddFive(int* Number) <br><br>　　 { <br><br>　　 *Number = *Number + 5; <br><br>　　 } <br><br>　　 void main() <br><br>　　 { <br><br>　　 int nMyNumber = 18; <br><br>　　 printf("My original number is %d\n", nMyNumber); <br><br>　　 AddFive(&amp;nMyNumber); <br><br>　　 printf("My new number is %d\n", nMyNumber); <br><br>　　 } <br></td>
        </tr>
    </tbody>
</table>
<p><br>你可以试着自己编写一个程序来证明这一点。注意到AddFive函数中Number之前的&#8220;*&#8221;的重要性了吗？这就是告知编译器我们要在指针Number指向的数字上加5，而不是向指针本身加5。 <br><br>最后要注意的一点是，你亦可以在函数中返回指针，像下面这个样子： <br><br>int * MyFunction(); <br><br>在这个例子中，MyFunction返回了一个指向整数的指针。</p>
<p>　　<strong>指向类的指针</strong><br><br>　　 关于指针，我还有还有两点需要提醒你。其中之一是指向结构或类的指针。你可以像这样定义一个类： <br><br></p>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　class MyClass <br><br>　　 { <br><br>　　 public: <br><br>　　 int m_Number; <br><br>　　 char m_Character; <br><br>　　 }; </td>
        </tr>
    </tbody>
</table>
<br>　　然后，你可以定义一个MyClass的变量： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>MyClass thing; </td>
        </tr>
    </tbody>
</table>
　 <br>　　你应该已经知道这些了，如果还没有的话，你需要阅读一下这方面的资料。你可以这样定义一个指向MyClass的指针： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　MyClass *thing; </td>
        </tr>
    </tbody>
</table>
<br>　　就像你期望的一样。然后，你可以为这个指针分配一些内存： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　thing = new MyClass; </td>
        </tr>
    </tbody>
</table>
<br>　　这就是问题之所在了——你将如何使用这个指针？呃，通常你会这么写：&#8220;thing.m_Number&#8221;，但是对于这个例子不行，因为thing并非一个MyClass，而是一个指向MyClass的指针，所以它本身并不包含一个名为&#8220;m_Number&#8221;的变量；它指向的结构才包含这个m_Number。因此，我们必须使用一种不同的转换方式。这就是将&#8220;.&#8221;(点)替换为一个&#8220;-&gt;&#8221;(横线和一个大于号)。请看下面这个例子： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　class MyClass <br><br>　　 { <br>　　　 public: <br>　　　　 int m_Number; <br>　　　　 char m_Character; <br>　　 }; <br><br>　　 void main() <br><br>　　 { <br><br>　　 MyClass *pPointer; <br><br>　　 pPointer = new MyClass; <br><br>　　 pPointer-&gt;m_Number = 10; <br><br>　　 pPointer-&gt;m_Character = 's'; <br><br>　　 delete pPointer; <br><br>　　 }<br></td>
        </tr>
    </tbody>
</table>
<br>　　 <strong>指向数组的指针</strong><br><br>　　你也可以使指针指向数组，如下： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　int *pArray; <br><br>　　 pArray = new int[6]; </td>
        </tr>
    </tbody>
</table>
<br>　　这将创建一个指针pArray，它会指向一个6个元素的数组。另一种不使用动态分配的方法如下： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　int *pArray; <br><br>　　 int MyArray[6]; <br><br>　　 pArray = &amp;MyArray[0]; </td>
        </tr>
    </tbody>
</table>
<br>　　请注意，你可以只写MyArray来代替&amp;MyArray[0]。当然，这种方法只适用于数组，是C/C++语言的实现使然(译注：你也可以把函数名赋值给一个相应的函数指针)。通常出现的错误是写成了&#8220;pArray = &amp;MyArray;&#8221;，这是不正确的。如果你这么写了，你会获得一个指向数组指针的指针(可能有些绕嘴吧？)，这当然不是你想要的。<br><br>　　 <strong>使用指向数组的指针</strong><br><br>　　如果你有一个指向数组的指针，你将如何使用它？呃，假如说，你有一个指向整数数组的指针吧。这个指针最初将会指向数组的第一个值，看下面这个例子： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　#include <br><br>　　 void main() <br><br>　　 { <br><br>　　 int Array[3]; <br><br>　　 Array[0] = 10; <br><br>　　 Array[1] = 20; <br><br>　　 Array[2] = 30; <br><br>　　 int *pArray; <br><br>　　 pArray = &amp;Array[0]; <br><br>　　 printf("pArray points to the value %d\n", *pArray); <br><br>　　　 } </td>
        </tr>
    </tbody>
</table>
<br>　　要想使指针移到数组的下一个值，我们可以使用pArray++。我们也可以——当然你们有些人可能也猜到了——使用pArray + 2，这将使这个数组指针移动两个元素。要注意的一点是，你必须清楚数组的上界是多少(在本例中是3)，因为在你使用指针的时候，编译器不能检查出来你是否已经移出了数组的末尾。所以，你可能很容易地使系统崩溃。下面仍然是这个例子，显示了我们所设置的三个值： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　#include <br><br>　　 void main() <br><br>　　 { <br><br>　　 int Array[3]; <br><br>　　 Array[0] = 10; <br><br>　　 Array[1] = 20;<br><br>　　 Array[2] = 30; <br><br>　　 int *pArray; <br><br>　　 pArray = &amp;Array[0]; <br><br>　　 printf("pArray points to the value %d\n", *pArray); <br><br>　　 pArray++; <br><br>　　 printf("pArray points to the value %d\n", *pArray); <br><br>　　 pArray++; <br><br>　　 printf("pArray points to the value %d\n", *pArray); <br><br>　　 } </td>
        </tr>
    </tbody>
</table>
<br>　　同样，你也可以减去值，所以pArray - 2就是pArray当前位置的前两个元素。不过，请确定你是在操作指针，而不是操作它指向的值。这种使用指针的操作在循环的时候非常有用，例如for或while循环。 <br><br>　　请注意，如果你有了一个指针(例如int* pNumberSet)，你也可以把它看作一个数组。比如pNumberSet[0]相当于*pNumberSet，pNumberSet[1]相当于*(pNumberSet + 1)。 <br><br>　　关于数组，我还有最后一句警告。如果你用new为一个数组分配空间的话，就像下面这个样子： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　int *pArray; <br><br>　　 pArray = new int[6]; </td>
        </tr>
    </tbody>
</table>
<br>　　那么必须这样释放它： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　delete[] pArray; </td>
        </tr>
    </tbody>
</table>
<br>　　请注意delete之后的[]。这告知编译器它正在删除一个整个的数组，而不是单独的一个项目。你必须在使用数组的时候使用这种方法，否则可能会获得一个内存泄漏。<br>　　<strong>最后的话</strong><br><br>　　最后要注意的是：你不能delete掉那些没有用new分配的内存，像下面这个样子： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　void main() <br><br>　　 { <br><br>　　　 int number; <br><br>　　　 int *pNumber = number; <br><br>　　　 delete pNumber; // 错误：*pNumber不是用new分配的 <br><br>　　 }</td>
        </tr>
    </tbody>
</table>
<br><br>　　 <strong>常见问题及FAQ</strong><br><br>　　 Q：为什么在使用new和delete的时候会得到&#8220;symbol undefined&#8221;错误？ <br><br>　　 A：这很可能是由于你的源文件被编译器解释成了一个C文件，因为new和delete操作符是C++的新特性。通常的改正方法是使用.cpp作为你的源文件扩展名。<br><br>　　 Q：new和malloc的区别是什么？ <br><br>　　 A：new是C++特有的关键词，并且是标准的分配内存方法(除了Windows程序的内存分配方法之外)。你绝不能在一个C C++程序中使用malloc，除非绝对必要。由于malloc并不是为C++面向对象的特色设计的，所以使用它为类对象分配内存就不会调用类的构造函数，这样就会出现问题。由于这些原因，本文并不对它们进行讨论，并且只要有可能，我亦会避免使用它们。 　　Q：我能一并使用free和delete吗？ <br><br>　　 A：你应该使用和分配内存相配套的方法来释放内存。例如，使用free来释放由malloc分配的内存，用delete来释放由new分配的内存。<br><br>　　 <strong>引用</strong><br><br>　　从某种角度上来说，引用已经超过了本文的范围。但是，既然很多读者问过我这方面的问题，那么我在此对其进行一个简要的讨论。引用和指针十分相似，在很多情况下用哪一个都可以。如果你能够回忆起来上文的内容——我提到的&#8220;&amp;&#8221;读作&#8220;the address of(&#8230;&#8230;的地址)&#8221;，在声明的时候例外。在声明的这种情况下，它应该读作&#8220;a reference to(&#8230;&#8230;的引用)&#8221;，如下： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　int&amp; Number = myOtherNumber; <br><br>　　 Number = 25; </td>
        </tr>
    </tbody>
</table>
<br>　　引用就像是myOtherNumber的指针一样，只不过它是自动解析地址的，所以它的行为就像是指针指向的实际值一样。与其等价的指针代码如下： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　int* pNumber = &amp;myOtherNumber; <br><br>　　 *pNumber = 25; </td>
        </tr>
    </tbody>
</table>
<br>　　指针和引用的另一个不同就是你不能更换引用的内容，也就是说你在声明之后就不能更换引用指向的内容了。例如，下面的代码会输出20： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　int myFirstNumber = 25; <br><br>　　 int mySecondNumber = 20; <br><br>　　 int &amp;myReference = myFirstNumber; <br><br>　　 myReference = mySecondNumber; <br><br>　　 printf("%d", myFristNumber); </td>
        </tr>
    </tbody>
</table>
<br>　　当在类中的时候，引用的值必须由构造函数设置，像下面这种方法一样： <br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>　　CMyClass::CMyClass(int &amp;variable) : m_MyReferenceInCMyClass(variable) <br><br>　　 { <br><br>　　　 // 这里是构造代码 <br><br>　　 }</td>
        </tr>
    </tbody>
</table>
<br>　　 <strong>总结</strong><br><br>　　这一主题最初是十分难以掌握的，所以你最好读上它个至少两遍——因为大多数人不能立即弄懂。下面我再为你列出本文的重点：<br><br>　　 1、指针是一种指向内存中某个位置的变量，你可以通过在变量名前添加星号(*)来定义一个指针(也就是int *number)。 <br><br>　　 2、你可以通过在变量名前添加&#8220;&amp;&#8221;来获得它的内存地址(也就是pNumber = &amp;my_number)。 <br><br>　　 3、除了在声明中以外(例如int *number)，星号应该读作&#8220;the memory location pointed to by(由&#8230;&#8230;指向的内存位置)&#8221;。 <br><br>　　 4、除了在声明中以外(例如int &amp;number)，&#8220;&amp;&#8221;应该读作&#8220;the address of(&#8230;&#8230;的地址)&#8221;。 <br><br>　　 5、你可以使用&#8220;new&#8221;关键字来分配内存。 <br><br>　　 6、指针必须和它所指向的变量类型相配套，所以int *number不应该指向一个MyClass。 <br><br>　　 7、你可以向函数传递指针。 <br><br>　　 8、你必须使用&#8220;delete&#8221;关键字来释放你分配的内存。 <br><br>　　 9、你可以使用&amp;array[0]来获得一个数组的指针。 <br><br>　　 10、你必须使用delete[]来释放动态分配的数组，而不是简单的delete。<br><br>　　这并非一个完全的指针指南，其中有一点我能够涉及到的其它细节，例如指针的指针；还有一些我一点也未涉及到的东西，例如函数指针——我认为作为初学者的文章，这个有些复杂了；还有一些很少使用的东西，在此我亦没有提到，省得让这些不实用的细节使大家感到混乱。 　　就这样了！你可以试着运行本文中的程序，并自己编写一些示例来弄懂关于指针的问题吧。 </div>
<img src ="http://www.cnitblog.com/Michael/aggbug/14761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Michael/" target="_blank">专业专注</a> 2006-08-05 15:15 <a href="http://www.cnitblog.com/Michael/archive/2006/08/05/14761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>