这其实是一个二级指针的问题,你可以看看下面的代码 int main() { int b = 1; int c = 2; int handle = (size_t)&c; int a = (size_t)&handle; /* 这里a保存了二级指针的值,二级指针解引用后是c的值 */ std::cout << *(int*)(*(int*)a) << '\n'; *(int*) a = (size_t) &b; /* 改变handle指向的位置 */ std::cout << *(int*)(*(int*)a) << '\n'; /* 二级指针解引用后是b的值 */ return 0; } int handle = (size_t)&c;这里的handle保存了变量c的地址int a = (size_t)&handle;这里的a保存了变量handle的地址,注意handle的值是c的地址,handle本身也是有一块地址空间的。 其实指针本质上可以说就是一个无符号的整数,跟操作系统相关。这里a的值就是handle的地址,所以a本质上是一个二级指针,*(int*) a = (size_t) &b;这句话就很明显了,(int*) a得到一个二级指针,*(int*) a对二级指针解引用,再把b的地址赋给它,这句话最后的作用就是让handle从指向c变成指向b了。 你可以尝试画几个指针的图,或者把几个变量的地址打印出来看看明白了。 特别说明:上面的代码只是举例说明,完全不符合代码规范,勿参考。
这其实是一个二级指针的问题,你可以看看下面的代码
int handle = (size_t)&c;
这里的
handle
保存了变量c
的地址int a = (size_t)&handle;
这里的
a
保存了变量handle
的地址,注意handle
的值是c
的地址,handle
本身也是有一块地址空间的。其实指针本质上可以说就是一个无符号的整数,跟操作系统相关。这里
a
的值就是handle
的地址,所以a本质上是一个二级指针,*(int*) a = (size_t) &b;
这句话就很明显了,
(int*) a
得到一个二级指针,*(int*) a
对二级指针解引用,再把b的地址赋给它,这句话最后的作用就是让handle
从指向c
变成指向b
了。你可以尝试画几个指针的图,或者把几个变量的地址打印出来看看明白了。
特别说明:
上面的代码只是举例说明,完全不符合代码规范,勿参考。