【问题标题】:Pointer assignment in C++. (Pointer to a pointer to pointer is on the LHS)C++中的指针赋值。 (指向指针的指针在 LHS 上)
【发布时间】:2012-03-22 10:38:12
【问题描述】:
IDirect3DSurface9 *var = NULL;

IDirect3DSurface9 *** ret;

我想把var解引用的值赋给ret指向的变量。

我做了以下事情:

(*(*(ret[0]))) = var;

我觉得这是正确的 C++ 语法。但是为什么我得到如下编译错误:

错误 C2679:二进制“=”:未找到使用右手的运算符 “IDirect3DSurface9 *”类型的操作数(或者这些是不可接受的 转换)。

正确的语法是什么?

【问题讨论】:

  • 您能否编辑您的问题以删除所有大写的粗体字。你不需要大喊大叫。我们可以在这里为您服务。
  • 我编辑了一点,但我现在不确定星号的预期数量:-S
  • @engineerMaster:无论何时你想说“这是与[不是我自己的人]的错误”,你可能错了。首先要尝试找你自己的错;这是一个简单的数字游戏,可以算出这是一种更有效的方法。
  • 为什么你有这么多指针?这看起来很可怕。
  • 如果你没有注意到,你的 Shift 键坏了。

标签: c++ visual-c++ pointers dereference


【解决方案1】:

您已取消引用指针 3 次。一次当您将其视为一个数组并使用索引[0] 时,然后使用* 运算符再进行两次。为了与var 兼容,您应该只取消引用两次。

为了更明确,让我们分解一下:

  • ret 的类型为 IDirect3DSurface9***。
  • ret[0] 的类型为 IDirect3DSurface9**。
  • *(ret[0]) 的类型为 IDirect3DSurface9*。
  • *(*(ret[0])) 的类型为 IDirect3DSurface9。

很明显,*(*(ret[0])) 的赋值与 var 的类型不兼容,IDirect3DSurface9*。

至于你的代码到底应该是什么,我不能肯定地说,但你需要删除一层间接性。

【讨论】:

  • 难以置信!!!!非常感谢你这么快的答复!!我解决了。 :) 我做了 *(*(ret[0])) = *var;现在两种类型的 LHS 和 RHS 是相同的。所以没有编译错误。
  • 这消除了编译错误,但我不相信它是正确的。当然,您的作业应该是IDirect3DSurface9* 级别而不是IDirect3DSurface9 级别。
  • 是的,我可以像 (ret[0]) = var;但我怀疑我们在 IDirectX3DSurface9 级别或 IDirectX3DSurface9 级别进行分配有什么关系。 Bcoz 最后我们正在复制存储在 tyoe IDirectX3DSurface9 变量中的值,对吗?对不起,如果我错了。请纠正我并澄清。谢谢。
  • 我强烈怀疑您的右手边是 var 而不是 *var 但我看不到您的其余代码。
  • @engineerMaster:不要那样做——IDirect3DSurface9 是一个 COM 接口,没有数据成员。您的分配将被编译,但它也会破坏接口所依赖的任何数据。只能使用指向 COM 接口的指针。
【解决方案2】:

每个* 和[] 都带走了一层间接性。所以在你的代码中

(*(*(ret[0]))) = var; 

左侧的类型为IDirect3DSurface9,而右侧的类型为IDirect3DSurface9 *。这两种类型是不同的,这就是你得到编译器错误的原因。您需要通过从 LHS 中删除(至少一个)* 或将 &(地址运算符)添加到 RHS(以拥有 &var)来解决此问题。

【讨论】:

    【解决方案3】:

    你可能想要:

    (*(*(ret[0]))) = &var;
    

    或

    *(*(*(ret[0]))) = var;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 2021-08-14
      • 2011-04-24
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多