📄 doublepointer.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>
指标可以用来储存(某变数的)记忆体位址,所以指标本身就是一个变数,也要占有记忆体空间才能储存资讯,那么指标的记忆体空间位址在哪呢?同样的使用
&运算子就可以得知了,例如: <br>
<br>
<pre>#include <iostream> <br>using namespace std; <br><br>int main() {<br> int p = 10; <br> int *ptr = &p; <br><br> cout << "p的值:" << p <br> << endl; <br> cout << "p的记忆体位置: " << &p <br> << endl;<br> cout << "*ptr参照的值: " << *ptr <br> << endl; <br> <br> cout << "ptr储存的位址值: " << ptr <br> << endl; <br> cout << "ptr的记忆体位置: " << &ptr <br> << 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 = &ptr;</span><br>
</div>
<br>
下面这个程式可得仔细看看: <br>
<br>
<pre>#include <iostream> <br>using namespace std; <br><br>int main() {<br> int p = 10; <br> int *ptr1 = &p; <br> int **ptr2 = &ptr1; <br><br> cout << "p的值:" << p << endl; <br> cout << "p的记忆体位置: " << &p << endl; <br><br> cout << endl;<br><br> cout << "*ptr1 = " << *ptr1 << endl; <br> cout << "ptr1 = " << ptr1 << endl; <br> cout << "ptr1的记忆体位置: " << &ptr1 << endl; <br><br> cout << endl;<br> <br> cout << "**ptr2 = " << **ptr2 << endl; <br> cout << "*ptr2 = " << *ptr2 << endl; <br> cout << "ptr2 = " << ptr2 << endl; <br><br> cout << endl;<br> <br> cout << "整理(谁储存了谁?):" << endl; <br> cout << "&p = " << &p << "\t\t" << "ptr1 = " << ptr1 << endl; <br> cout << "&ptr1 = " << &ptr1 << "\t" <br> << "ptr2 = " << ptr2 <br> << 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>
&p =
0x22ff74
ptr1 = 0x22ff74<br>
&ptr1 = 0x22ff70 ptr2 =
0x22ff70</span></small></td>
</tr>
</tbody>
</table>
<br>
在执行结果中,您可以看到最后的整理中,ptr1储存了p变数所占有的位址,而ptr2则储存了ptr1所占有的位址,所以当您使用*取值运算子时,
*ptr2取出的是ptr1所储存的值,也就是&p,而再使用一次*运算子时,也就是**ptr2时,因为*ptr2 ==
ptr1,所以*(*ptr2 ) == *ptr1,而*ptr1 == p,所以也就是取出了p的值了。
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -