内存地址有多少可能还有另一个内存地址?

时间:2015-04-28 10:53:42

标签: c pointers pointer-to-pointer

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

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

3 个答案:

答案 0 :(得分:5)

执行&ptr后,您将获得变量ptr的地址。

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

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

另请注意,请勿使用"%d"格式打印指针。请改用"%p",然后将指针转换为void *

答案 1 :(得分: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 如果您尝试打印*pptr,则会在与pptr012345678的值对应的地址处显示值 如果您尝试打印**pptr,它会在与pptr30

值对应的地址处的值对应的地址显示值

答案 2 :(得分:1)

此ASCII艺术将帮助您理解

       pptr                ptr                 var       

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