一个内存地址还有另一个内存地址怎么可能?
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
,它将显示与 pptr
、012345678
的值对应的地址处的值
而如果你尝试打印**pptr
,它会显示pptr
、30
的值对应的地址对应的值
这种 ASCII 艺术将帮助您理解
pptr ptr var
+----------+ +----------+ +-----------+
| | | | | |
| 0x67890 +------> | 0x12345 +------> | 30 |
| | | | | |
+----------+ +----------+ +-----------+
0xABCDE 0x67890 0x12345
我已经将整数变量的地址存储在一个指针中,然后将前一个变量的地址存储到另一个指针中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
,它将显示与 pptr
、012345678
的值对应的地址处的值
而如果你尝试打印**pptr
,它会显示pptr
、30
这种 ASCII 艺术将帮助您理解
pptr ptr var
+----------+ +----------+ +-----------+
| | | | | |
| 0x67890 +------> | 0x12345 +------> | 30 |
| | | | | |
+----------+ +----------+ +-----------+
0xABCDE 0x67890 0x12345