Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
192 views
in Technique[技术] by (71.8m points)

C++问题指针问题

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

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了。

你可以尝试画几个指针的图,或者把几个变量的地址打印出来看看明白了。

特别说明:
上面的代码只是举例说明,完全不符合代码规范,勿参考。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...