我已将整数变量的地址存储在指针中,然后将前一个地址存储到另一个指针中。我无法理解它是如何工作的。
#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;
}
答案 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
,则会在与pptr
,012345678
的值对应的地址处显示值
如果您尝试打印**pptr
,它会在与pptr
,30
答案 2 :(得分:1)
此ASCII艺术将帮助您理解
pptr ptr var
+----------+ +----------+ +-----------+
| | | | | |
| 0x67890 +------> | 0x12345 +------> | 30 |
| | | | | |
+----------+ +----------+ +-----------+
0xABCDE 0x67890 0x12345