0

我已经将一个整数变量的地址存储在一个指针中,然后将先前的地址存储到另一个指针中。我无法理解它实际上是如何工作的。

#include <iostream>

using namespace std;

#include <stdio.h>

int main ()
{
    int  var;
    int  *ptr;
    int  **pptr;

    var = 30;

    /* take the address of var */
    ptr = &var;

   /* take the address of ptr using address of operator & */
    pptr = &ptr;

    /* take the value using pptr */
    printf("Value of var = %d\n", var );
    printf("Value available at ptr = %d\n", ptr );
    printf("Value available at pptr = %d\n", pptr);

    return 0;
}
4

3 回答 3

5

当你这样做时,&ptr你会得到存储变量的地址ptr

所以你有一个指针pptr,它指向ptr的又指向var。像这样:

+-----+ +-----+ +-----+
| ppt | --> | 指针 | --> | 变量 |
+-----+ +-----+ +-----+

在旁注中,不要使用"%d"格式来打印指针。改为使用"%p",然后将指针强制转换为void *.

于 2015-04-28T10:59:19.663 回答
2

假设var存储在内存地址 0x12345678、ptr地址 0x23456789 和pptr地址 0x34567890。

当你这样做

var = 30;

您将 30 存储在 var 的值中(在 var 的地址,0x12345678

当你这样做

ptr = &var;

您将 var 的地址存储在 ptr 的值中。当你这样做

pptr = &ptr;

您将 ptr 的地址存储在 pptr 的值中。

记忆长这样

Address       Value stored
...
0x12345678    30
...
0x23456789    0x12345678
...
0x34567890    0x23456789

如果 尝试 打印pptr会显示_ _的值对应的地址,0x23456789*pptrpptr012345678**pptrpptr30

于 2015-04-28T11:05:37.303 回答
1

这个 ASCII 艺术将帮助你理解

       pptr                ptr                 var       

   +----------+        +----------+        +-----------+
   |          |        |          |        |           |
   | 0x67890  +------> |  0x12345 +------> |    30     |
   |          |        |          |        |           |
   +----------+        +----------+        +-----------+
     0xABCDE             0x67890              0x12345   
于 2015-04-28T11:08:41.670 回答