一个内存地址还有另一个内存地址怎么可能?

How possible that an memory address also have another memory address ?

我已经将整数变量的地址存储在一个指针中,然后将前一个变量的地址存储到另一个指针中pointer.I我无法理解它的实际工作原理。

#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;
}

当您执行 &ptr 时,您将获得存储变量 ptr 的地址。

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

+------+     +-----+     +-----+
| pptr | --> | ptr | --> | var |
+------+     +-----+     +-----+

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

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

当你这样做时

var = 30;

你在var的值中存入了30(在var的地址,0x12345678

当你这样做时

ptr = &var;

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

pptr = &ptr;

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

记忆是这样的

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

如果您尝试打印 pptr,它将显示 0x23456789 如果您尝试打印 *pptr,它将显示与 pptr012345678 的值对应的地址处的值 而如果你尝试打印**pptr,它会显示pptr30

的值对应的地址对应的值

这种 ASCII 艺术将帮助您理解

       pptr                ptr                 var       

   +----------+        +----------+        +-----------+
   |          |        |          |        |           |
   | 0x67890  +------> |  0x12345 +------> |    30     |
   |          |        |          |        |           |
   +----------+        +----------+        +-----------+
     0xABCDE             0x67890              0x12345