⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doublepointer.html

📁 关于 C++ 的历史无须我来介绍了
💻 HTML
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

  
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">

  
  <link rel="stylesheet" href="css/print.css" type="text/css">

  
  <meta content="text/html; charset=gb2312" http-equiv="content-type">

  
  <title>双重指标</title>
</head>


<body>

<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>

<h1><a href="CppGossip.html">C++ Gossip: 双重指标</a></h1>

<br>

“双重指标”也有人称为“指标的指标”,其作用为“间接参照”,但无论是哪一个名词,都是令人困惑的,其实指标就是指标,所谓的多重指标,其实还是指标,
它们的作用单纯来说,都是用以储存记忆体位址。 <br>

<br>

思考一个问题,当您要取得int变数的记忆体位址时,会使用int*来宣告指标,要取得double变数的记忆体位址时,会使用double*来宣告指
标,这是因为它们在进行加减法运算时,所位移的单位并不相同,而是根据它们的资料型态而定,而如果您只是要储存一个记忆体位址,您就宣告指标为void*
型态。 <br>

<br>

指标可以用来储存(某变数的)记忆体位址,所以指标本身就是一个变数,也要占有记忆体空间才能储存资讯,那么指标的记忆体空间位址在哪呢?同样的使用
&amp;运算子就可以得知了,例如: <br>

<br>

<pre>#include &lt;iostream&gt; <br>using namespace std; <br><br>int main() {<br>    int p = 10; <br>    int *ptr = &amp;p; <br><br>    cout &lt;&lt; "p的值:" &lt;&lt; p <br>         &lt;&lt; endl; <br>    cout &lt;&lt; "p的记忆体位置: " &lt;&lt; &amp;p <br>         &lt;&lt; endl;<br>    cout &lt;&lt; "*ptr参照的值: " &lt;&lt; *ptr <br>         &lt;&lt; endl; <br>    <br>    cout &lt;&lt; "ptr储存的位址值: " &lt;&lt; ptr <br>         &lt;&lt; endl; <br>    cout &lt;&lt; "ptr的记忆体位置: " &lt;&lt; &amp;ptr <br>         &lt;&lt; endl; <br>       <br>    return 0; <br>}</pre>

<br>

执行结果:<br>

<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">

  <tbody>

    <tr>

      <td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">p的值:10<br>

p的记忆体位置: 0x22ff74<br>

*ptr参照的值: 10<br>

ptr储存的位址值: 0x22ff74<br>

ptr的记忆体位置: 0x22ff70</span></small></td>

    </tr>

  
  </tbody>
</table>

<br>

由以上的范例,您知道ptr在记忆体中的0x22ff70占据空间,并储存了0x22ff74这个值,0x22ff74也就是p在记忆体中的位置,该位置
储存了10这个值。 <br>

<br>

如果在上例中,您要储存ptr的记忆体位址,也就是0x22ff70这个值,那么如何作?由于ptr是个int*型态变数,如同int变数必须宣告
int*指标,所以int*型态变数就必须宣告int**型态的指标,例如: <br>

<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">int **ptr2 = &amp;ptr;</span><br>

</div>

<br>

下面这个程式可得仔细看看: <br>

<br>

<pre>#include &lt;iostream&gt; <br>using namespace std; <br><br>int main() {<br>    int p = 10; <br>    int *ptr1 = &amp;p; <br>    int **ptr2 = &amp;ptr1; <br><br>    cout &lt;&lt; "p的值:" &lt;&lt; p &lt;&lt; endl; <br>    cout &lt;&lt; "p的记忆体位置: " &lt;&lt; &amp;p &lt;&lt; endl; <br><br>    cout &lt;&lt; endl;<br><br>    cout &lt;&lt; "*ptr1 = " &lt;&lt; *ptr1 &lt;&lt; endl; <br>    cout &lt;&lt; "ptr1 = " &lt;&lt; ptr1 &lt;&lt; endl; <br>    cout &lt;&lt; "ptr1的记忆体位置: " &lt;&lt; &amp;ptr1 &lt;&lt; endl; <br><br>    cout &lt;&lt; endl;<br>    <br>    cout &lt;&lt; "**ptr2 = " &lt;&lt; **ptr2 &lt;&lt; endl; <br>    cout &lt;&lt; "*ptr2 = " &lt;&lt; *ptr2 &lt;&lt; endl; <br>    cout &lt;&lt; "ptr2 = " &lt;&lt; ptr2 &lt;&lt; endl; <br><br>    cout &lt;&lt; endl;<br>    <br>    cout &lt;&lt; "整理(谁储存了谁?):" &lt;&lt; endl; <br>    cout &lt;&lt; "&amp;p = " &lt;&lt; &amp;p &lt;&lt; "\t\t" &lt;&lt; "ptr1 = " &lt;&lt; ptr1 &lt;&lt; endl; <br>    cout &lt;&lt; "&amp;ptr1 = " &lt;&lt; &amp;ptr1 &lt;&lt; "\t" <br>         &lt;&lt; "ptr2 = " &lt;&lt; ptr2 <br>         &lt;&lt; endl;<br>    <br>    return 0; <br>}<br></pre>

<br>

执行结果:<br>

<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">

  <tbody>

    <tr>

      <td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">p的值:10<br>

p的记忆体位置: 0x22ff74<br>

      <br>

*ptr1 = 10<br>

ptr1 = 0x22ff74<br>

ptr1的记忆体位置: 0x22ff70<br>

      <br>

**ptr2 = 10<br>

*ptr2 = 0x22ff74<br>

ptr2 = 0x22ff70<br>

      <br>

整理(谁储存了谁?):<br>

&amp;p =
0x22ff74&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ptr1 = 0x22ff74<br>

&amp;ptr1 = 0x22ff70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr2 =
0x22ff70</span></small></td>

    </tr>

  
  </tbody>
</table>

<br>

在执行结果中,您可以看到最后的整理中,ptr1储存了p变数所占有的位址,而ptr2则储存了ptr1所占有的位址,所以当您使用*取值运算子时,
*ptr2取出的是ptr1所储存的值,也就是&amp;p,而再使用一次*运算子时,也就是**ptr2时,因为*ptr2 ==
ptr1,所以*(*ptr2 ) == *ptr1,而*ptr1 == p,所以也就是取出了p的值了。
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -