我在下面的例子中写了*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]
答案 0 :(得分:3)
输出为10
,因为任何与其自身进行位编辑的数字都保持不变。
表达式的作用很简单:它取消引用y_ptr
,它指向val
,并使用相同的val
按位和结果。
注意:您需要将x_ptr
初始化到某个位置,以避免因取消引用未初始化的指针而导致潜在崩溃。
答案 1 :(得分:2)
按位&
这是一种非常笨拙且用括号括起来的方式。更清楚:
*x_ptr = *y_ptr & val;
虽然x_ptr
未初始化,但无论如何这都是UB。
您编辑的代码是错误的,因为您正在尝试将int
分配给int*
,正如您的编译器明确指出的那样。这显然无效。