C++问题指针问题

*(int *)a=&b
这里的(int*)是强制转换? 为啥外面还有个*

阅读 2k
2 个回答

这其实是一个二级指针的问题,你可以看看下面的代码

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 *p = (int *)a;
    *p = &b;
//  ^ 外面那个 *
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题