C++ C+中的指针赋值+;。(指向指针的指针位于左侧)

C++ C+中的指针赋值+;。(指向指针的指针位于左侧),c++,visual-c++,pointers,dereference,C++,Visual C++,Pointers,Dereference,我想把var解引用的值赋给ret指向的变量 我做了以下事情: IDirect3DSurface9 *var = NULL; IDirect3DSurface9 *** ret; 我觉得这是正确的C++语法。但为什么我会得到如下编译错误: 错误C2679:二进制“=”:未找到右边的运算符 “IDirect3DSurface9*”类型的操作数(或这些操作数不可接受 转换) 正确的语法是什么?您已取消引用指针3次。当您将其视为一个数组并使用索引[0],然后使用*运算符再使用两次。为了与var兼容,

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

我做了以下事情:

IDirect3DSurface9 *var = NULL;

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

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


正确的语法是什么?

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

更明确地说,让我们将其分解:

  • ret
    具有类型
    IDirect3DSurface9***
  • ret[0]
    具有类型
    IDirect3DSurface9**
  • *(ret[0])
    具有类型
    IDirect3DSurface9*
  • *(*(ret[0])
    具有类型
    IDirect3DSurface9
显然,
*(*(ret[0])
与类型为
IDirect3DSurface9*
var
的赋值不兼容


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

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

更明确地说,让我们将其分解:

  • ret
    具有类型
    IDirect3DSurface9***
  • ret[0]
    具有类型
    IDirect3DSurface9**
  • *(ret[0])
    具有类型
    IDirect3DSurface9*
  • *(*(ret[0])
    具有类型
    IDirect3DSurface9
显然,
*(*(ret[0])
与类型为
IDirect3DSurface9*
var
的赋值不兼容

至于您的代码到底应该是什么,我不能肯定,但您需要删除一级间接寻址。

您可能需要:

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

您可能想要:

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


每个
*
[]
都会减少一级间接寻址。所以在你的代码中

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

左侧的类型为
IDirect3DSurface9
,而右侧的类型为
IDirect3DSurface9*
。这两种类型是不同的,这就是为什么会出现编译器错误。您需要通过从LHS中删除(至少一个)
*
,或向RHS中添加一个
&
(操作员地址)(以具有
&var
)来解决此问题。

每个
*
[]
都会取消一级间接寻址。所以在你的代码中

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

左侧的类型为
IDirect3DSurface9
,而右侧的类型为
IDirect3DSurface9*
。这两种类型是不同的,这就是为什么会出现编译器错误。您需要通过从LHS中删除(至少一个)
*
,或在RHS中添加一个
&
(操作员地址)(以拥有
&var
)来解决此问题。

您可以编辑您的问题以删除所有粗体大写字母吗。你不需要大喊大叫。我们可以在这里向您展示。我编辑了一些,但我现在不确定星号的预期数量:-S@engineerMaster当前位置每当你想说“这是[某个不是我的人]的错误”时,你可能错了。首先,要试着找出自己的缺点;这是一个简单的数字游戏,可以看出这是一个更有效的方法。为什么你有这么多的指针?这看起来很可怕。如果你没有注意到,你的Shift键坏了。你能编辑你的问题以删除所有粗体字和大写字母吗。你不需要大喊大叫。我们可以在这里向您展示。我编辑了一些,但我现在不确定星号的预期数量:-S@engineerMaster当前位置每当你想说“这是[某个不是我的人]的错误”时,你可能错了。首先,要试着找出自己的缺点;这是一个简单的数字游戏,可以看出这是一个更有效的方法。为什么你有这么多的指针?这看起来很可怕。如果你没有注意到,你的换档钥匙坏了。难以置信!!!!非常感谢你这么快的回答!!我解决了我做了*(*(ret[0])=*var;现在两种类型的LHS和RHS都是相同的。所以没有编译错误。这就消除了编译错误,但我不相信它是正确的。当然,您的作业应该是
IDirect3DSurface9*
级别,而不是
IDirect3DSurface9
级别。是的,我可以将其更改为(ret[0])=var;但我怀疑,我们是在IDirectX3DSurface9级别还是在IDirectX3DSurface9级别执行任务有什么关系。Bcoz最后,我们要复制存储在tyoe IDirectX3DSurface9变量中的值,对吗?对不起,如果我错了。请纠正我并澄清。谢谢。我强烈怀疑您的右侧是
var
而不是
*var
,但我看不到您的其余代码。@engineerMaster:不要这样做-
IDirect3DSurface9
是COM接口,没有数据成员。您的任务将被编译,但它也会破坏接口所依赖的任何数据。只能使用指向COM接口的指针。难以置信!!!!非常感谢你这么快的回答!!我解决了我做了*(*(ret[0])=*var;现在两种类型的LHS和RHS都是相同的。所以没有编译错误。这就消除了编译错误,但我不相信它是正确的。当然,您的作业应该是
IDirect3DSurface9*
级别,而不是
IDirect3DSurface9
级别。是的,我可以将其更改为(ret[0])=var;但我怀疑这有什么关系