这其实是一个二级指针的问题,你可以看看下面的代码
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) << '
';
*(int*) a = (size_t) &b; /* 改变handle指向的位置 */
std::cout << *(int*)(*(int*)a) << '
'; /* 二级指针解引用后是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
了。
你可以尝试画几个指针的图,或者把几个变量的地址打印出来看看明白了。
特别说明:
上面的代码只是举例说明,完全不符合代码规范,勿参考。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…