【问题标题】:How do you explain *(y_ptr)&val;你如何解释 *(y_ptr)&val;
【发布时间】:2017-01-22 22:58:49
【问题描述】:

问题描述

我在下面的例子中写了*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)&amp;val改成x_ptr = *(y_ptr)&amp;val编译器会报如下错误为什么?

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

【问题讨论】:

  • 这是未定义的行为:取消引用未初始化的x_ptr
  • &amp; 是二元与运算符。
  • 哦,天哪,我看到了混乱。它被解释为(*(y_ptr))&amp;(val),但如果y_ptr 是一个类型而不是一个变量,它也可以理解为*((y_ptr)(&amp;val))
  • 对不起@Mark Ransom。你去吧。我真的很想了解您在评论中的意思。我淹没在自己的愚蠢中。你能举个例子吗:但是如果 y_ptr 是一个类型而不是一个变量,那么它也是有意义的 *((y_ptr)(&val))
  • & 符号&amp;两个 含义,它可以是逐位的and,也可以将变量的地址作为指针。括号() 也有两种含义,它们可以表示运算符分组,也可以表示C 风格的类型转换。上下文决定使用哪种含义。

标签: c++ pointers memory-address dereference


【解决方案1】:

这是一个非常尴尬的间隔和括号按位方式&amp;。更清楚:

*x_ptr = *y_ptr & val;

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

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

【讨论】:

    【解决方案2】:

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

    表达式的作用很简单:它取消引用y_ptr,它指向val,并将结果与​​相同的val 进行位与运算。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 2015-05-03
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多