﻿<?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++博客-&lt;∩扫地僧∩&gt;-----扫净千秋落叶，拂散万世蒙尘！-随笔分类-C++</title><link>http://www.cppblog.com/kingbe/category/9237.html</link><description>The dream is exhaustis.</description><language>zh-cn</language><lastBuildDate>Mon, 05 Jan 2009 04:39:08 GMT</lastBuildDate><pubDate>Mon, 05 Jan 2009 04:39:08 GMT</pubDate><ttl>60</ttl><item><title>迷糊的多维数组的地址</title><link>http://www.cppblog.com/kingbe/archive/2009/01/05/71187.html</link><dc:creator>扫地僧</dc:creator><author>扫地僧</author><pubDate>Sun, 04 Jan 2009 18:25:00 GMT</pubDate><guid>http://www.cppblog.com/kingbe/archive/2009/01/05/71187.html</guid><wfw:comment>http://www.cppblog.com/kingbe/comments/71187.html</wfw:comment><comments>http://www.cppblog.com/kingbe/archive/2009/01/05/71187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kingbe/comments/commentRss/71187.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kingbe/services/trackbacks/71187.html</trackback:ping><description><![CDATA[&nbsp;
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么要写这个？因为这个东西有点混乱，至少我第一次接触的时候是这样的。或许以后还会，所以记下来需要的人一起看吧。</p>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;直接上主题，我做事就是很直接，当然也会很啰嗦，下面你将会一并体验到。</p>
<p style="COLOR: #000000" align=left>int count[2][3] = {{1,2,3},{4,5,6}};</p>
<p style="COLOR: #000000" align=left>count //数组count[0][0]的地址。</p>
<p style="COLOR: #000000" align=left>count+1//数组count[0][0]行数的偏移量为1的地址，即count[1][0]的地址。</p>
<p style="COLOR: #000000" align=left>*（count+1）//等效于count+1。</p>
<p style="COLOR: #000000" align=left>*（count+1）+1//count[0][0]行数偏移量为1，列数偏移量为1的地址，即count[1][1]的地址。</p>
<p style="COLOR: #000000" align=left>**（count+1）//count[1][0]的值。注意这里是2个&#8220;*&#8221;。</p>
<p style="COLOR: #000000" align=left>*（*（count+1）+1）//count[1][1]的值，这里也可以写成**（count+1）+1，结果都是一样的，反正就是要2个&#8220;*&#8221;。说到这里有的人可能就觉得奇怪了，上面不是说了&#8220;*（count+1）//等效于count+1&#8221;那*（*（count+1）+1）能不能写成*（（count+1）+1）呢？答案是很肯定的：不能。为什么呢？我的理解是：如果单纯地表示行地址的时候有无&#8220;*&#8221;都无所谓，反正是一行的地址，同时也是一行的第一列元素的地址。*（*（count+1）+1）含义是先取得第1行的地址，然后再在第1行内偏移1列后，取得地址所存储的值4。如果写成*（（count+1）+1）则含义变成：行数偏移1后再偏移1后的地址。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里有点饶头，多看几次就会明白了。当然按照我的理解来看也是有一定风险的，因为我可能理解错了。不过这些结果我都试验过的，绝对不会错的。</p>
<p style="COLOR: #000000" align=left>*（count+1）[1]//count[1][1]的值。首先用*（count+1）取得行地址，然后用[1]直接获取这个地址中第1号元素的值。这个表达式等效于*(count[1]+1)，同时也等效于*(*(count+1)+1)。~~扑通~~已经有人彻底晕倒了。这里的&#8220;*（count+1）&#8221;，&#8220;count[1]&#8221;都是为了有效地进行行地址定位，因为只有先找到行地址才能进列定位嘛！</p>
<p style="COLOR: #000000">最后总结：</p>
<p style="COLOR: #000000">1.&nbsp;&nbsp;&nbsp;&nbsp;如果你是想获得多维数组中一行的地址则使用不使用&#8220;*&#8221;都无所谓。前提是没有&#8220;[]&#8221;出现。</p>
<p style="COLOR: #000000">2.&nbsp;&nbsp;&nbsp;&nbsp;如果你是想获得多维数组中元素的地址则首先得确定好此元素的行地址（使用&#8220;*&#8221;，比如*（count+1）这样就确定了是第1行的地址），然后再进行列偏移。</p>
<p style="COLOR: #000000">3.&nbsp;&nbsp;&nbsp;&nbsp;如果你是想获得多维数组中元素的值，则可以在地址之前加&#8220;*&#8221;一般整个表达式是2个&#8220;*&#8221;，因为确定某一行的时候的那个&#8220;*&#8221;是必不可少的。当然也可以使用带有&#8220;[]&#8221;的方式，这个方式里面需一个&#8220;*&#8221;和一个&#8220;[]&#8221;就可以获得数组的值。如果你说使用count[1][1]这样的方式不是更好么？你说的一点都没错，不过我这里主要讨论的是与地址相关的内容。不过要顺带说一下如果使用双&#8220;[]&#8221;的情况下表达式前加不加&#8220;*&#8221;都是无所谓的。</p>
<p style="COLOR: #000000">再一次总结：</p>
<p style="COLOR: #000000">1．&nbsp;多维数组的地址中，重点就是进行行地址定位，有2种方式，第一种：加&#8220;*&#8221;eg：*（count+1）。第二种：使用&#8220;[]&#8221;eg：count[1]。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里有一个问题啊，* count[1]是地址还是值啊？如果你的回答是地址那请再回头看一下最后总结第一条。这里的* count[1]表示的是一个值，因为这条语句的含义是取count[1]的值，可是count[1]只是一个地址，只进行了行定位，偏要它交出一个值出来，只好把列排名第一的第0个元素丢了出来，即count[1][0]。</p>
<p style="COLOR: #000000" align=left>学生朋友应付考试的总结：<br>1．&nbsp;单个&#8220;*&#8221;或单个&#8220;[]&#8221;可以获得地址；双&#8220;*&#8221;或双&#8220;[]&#8221;或一个&#8220;*&#8221;加上一个&#8220;[]&#8221;可以获得数组值。这样的规律是不是很简洁明了？<br><br>&nbsp;错误不足之处还请大家多多指正！谢谢！</p><img src ="http://www.cppblog.com/kingbe/aggbug/71187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kingbe/" target="_blank">扫地僧</a> 2009-01-05 02:25 <a href="http://www.cppblog.com/kingbe/archive/2009/01/05/71187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>                                                                   指针 第一印象</title><link>http://www.cppblog.com/kingbe/archive/2008/12/31/70853.html</link><dc:creator>扫地僧</dc:creator><author>扫地僧</author><pubDate>Wed, 31 Dec 2008 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/kingbe/archive/2008/12/31/70853.html</guid><wfw:comment>http://www.cppblog.com/kingbe/comments/70853.html</wfw:comment><comments>http://www.cppblog.com/kingbe/archive/2008/12/31/70853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kingbe/comments/commentRss/70853.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kingbe/services/trackbacks/70853.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 14pt"><strong>1.指针怎样声明？</strong></span>
<p style="FONT-FAMILY: 楷体_GB2312">&nbsp; 使用* 比如int* a;</p>
<p style="FONT-FAMILY: 楷体_GB2312"><strong style="FONT-SIZE: 14pt">2.指针中存放的是什么呢？</strong></p>
<p style="FONT-FAMILY: 楷体_GB2312">&nbsp; 指针中存放的是地址。比如 int* a = NLL; int b = 0; a = &amp;b;</p>
<p style="FONT-FAMILY: 楷体_GB2312">&nbsp; 例子中把b的地址给了int型指针a。&amp;符号是用来获得任何变量地址的，这里变量b的地址就是&amp;b。<br><br>&nbsp; 那b的地址的值是多少呢？这个是内存中分配的，每次都可能不一样。<br><br>&nbsp; 这里还需要注意的是变量的类型必须和指针的类型一致才可以把变量的地址放入指针中去。</p>
<p style="FONT-FAMILY: 楷体_GB2312"><strong style="FONT-SIZE: 14pt">3.指针中的地址的值如何获取？</strong></p>
<p style="FONT-FAMILY: 楷体_GB2312">&nbsp; 同样是*这个符号，比如我们要获取指针a的值，直接*a就可以了。<br><br>&nbsp; 比如*a+1 结果为1。如果写成a+1就是不正确的了，得出的结果就是a中的内存地址加上1后的那块内存地址了。</p>
<p style="FONT-FAMILY: 楷体_GB2312">&nbsp; 但是特别的是，如果你定义成 char *string = &#8220;Hello world!&#8221;;直接string获得的值并不是地址而是&#8220;Hello world!&#8221;。<br><br>&nbsp; 为什么呢？因为输出操作把char*当成char数组来对待。</p>
<p style="FONT-FAMILY: 楷体_GB2312"><strong style="FONT-SIZE: 14pt">4.什么是指针数组？</strong></p>
<p style="FONT-FAMILY: 楷体_GB2312">&nbsp; 说白了讲就是数组的中存放的是指针。</p>
<p style="FONT-FAMILY: 楷体_GB2312" align=justify>&nbsp; 比如char &nbsp;*strChar[] = {&#8220;123&#8221;,&#8221;1234&#8221;,&#8221;12345&#8221;}; 则strChar[0]中存放的是&#8221;123&#8221;地址的值，以此类推。<br><br>&nbsp; 但是这里虽然存放的是地址的值，但是可以直接用strChar[0]取得&#8221;123&#8221;。</p>
<img src ="http://www.cppblog.com/kingbe/aggbug/70853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kingbe/" target="_blank">扫地僧</a> 2008-12-31 15:25 <a href="http://www.cppblog.com/kingbe/archive/2008/12/31/70853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>