你怎么解释 *(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
因为任何数字与自身的位与运算都保持不变。
表达式的作用很简单:它取消引用指向 val
的 y_ptr
,并将结果与相同的 val
.
按位与运算
注意: 您需要将 x_ptr
初始化到某个位置,以避免因取消引用未初始化的指针而导致潜在的崩溃。
问题描述
我下面的例子是我写的*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
因为任何数字与自身的位与运算都保持不变。
表达式的作用很简单:它取消引用指向 val
的 y_ptr
,并将结果与相同的 val
.
注意: 您需要将 x_ptr
初始化到某个位置,以避免因取消引用未初始化的指针而导致潜在的崩溃。