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

How do you explain *(y_ptr)&val;

问题描述

我下面的例子是我写的*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编译器会报如下错误why?

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

按位 & 这是一种非常笨拙的间隔和括号方式。更清楚:

*x_ptr = *y_ptr & val;

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

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

输出是 10 因为任何数字与自身的位与运算都保持不变。

表达式的作用很简单:它取消引用指向 valy_ptr,并将结果与​​相同的 val.

按位与运算

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