你怎么解释*(y_ptr)& val;

时间:2016-09-15 02:19:50

标签: c++ pointers memory-address dereference

问题描述

我在下面的例子中写了*x_ptr = *(y_ptr)&val;我无法理解输出为10的原因。记忆中发生了什么?我无法理解这种组合。

// Example program
#include <iostream>
#include <string>

int main()
{
   int *x_ptr, *y_ptr;
   int val = 10;
   y_ptr = &val; 
   *x_ptr = *(y_ptr)&val;

   std::cout << *x_ptr << std::endl;
}

假设我将*x_ptr = *(y_ptr)&val更改为x_ptr = *(y_ptr)&val,编译器会给出以下错误原因?

10:20: error: invalid conversion from 'int' to 'int*' [-fpermissive]

2 个答案:

答案 0 :(得分:3)

输出为10,因为任何与其自身进行位编辑的数字都保持不变。

表达式的作用很简单:它取消引用y_ptr,它指向val,并使用相同的val按位和结果。

注意:您需要将x_ptr初始化到某个位置,以避免因取消引用未初始化的指针而导致潜在崩溃。

答案 1 :(得分:2)

按位&这是一种非常笨拙且用括号括起来的方式。更清楚:

*x_ptr = *y_ptr & val;

虽然x_ptr未初始化,但无论如何这都是UB。

您编辑的代码是错误的,因为您正在尝试将int分配给int*,正如您的编译器明确指出的那样。这显然无效。