把自己弄糊涂了,指针对指针太多了

Confusing myself with too many pointers to pointers

本文关键字:指针 太多 自己 弄糊涂      更新时间:2023-10-16

可能重复:
C++:将指针变量传递给函数

下面是一个简化的代码片段,我认为它显示了当前的问题:

std::wstring *Variable3 = &SomeWStringObject;
int _tmain(int argc, _TCHAR* argv[])
{
    std::wstring *Variable1 = NULL;
    func(Variable1);
}
void func(std::wstring *Variable2)
{
    Variable2 = Variable3;
}

现在,在现实中,func是一个类的成员,而Variable3也是同一类的成员。对于这个更简单的例子,我们假设Variable3是某种全局变量。

Variable3是指向std::wstring对象的(全局变量(指针。我可以在调试器中看到它指向的是正确的字符串。

最后,我希望Variable1指向与Variable3相同的std::wstring对象。

因此,我尝试将指针Variable1的地址传递到函数中,希望它能将Variable3指向的地址设置到Variable1中。

但这不起作用。它似乎设置为OK,但当程序离开func时,Variable1仍然是一个空指针。

我试着尽可能清楚。我希望这已经足够了。不幸的是,我不能使用func的返回值,因为我实际上还有另外两个std::wstringstream对象要做同样的事情。由于所有对象都有相同的问题,我将其简化为只有一个std::wstring对象。我尝试过许多其他不同的&*组合,但都没有成功。

非常感谢你能提供的任何帮助。

通过引用传递指针:

void func(std::wstring *& Variable2)

尽管按照其他答案的建议,还有更好的方法来完成你正在做的事情。在这种情况下使用指针是多余的。

我将跳过中间步骤。在C++中,你可以这样做:

std::string mystring;
std::string func() {
    return mystring;
}
int main() {
    std::string variable1 = func();
}

几句话:

  • 失去指针。它们在这里没有帮助,只是增加了复杂性
  • 要修改参数,请通过引用传递(但我还没有这样做(
  • 不要修改参数。而是返回值
  • 除了与WinAPI接口之外,不要使用std::wstring
  • 如果您需要共享对同一基础字符串的引用,因为您想通过main中的变量透明地修改它(而且只有这样!(,请返回引用而不是副本:

    std::string& func() {
        return mystring;
    }
    

    …但无论如何,这可能是一个坏主意:如果func确实是一个成员函数,它通常不应该向外部世界公开内部可修改的状态,这违反了良好代码设计的几个规则。

此时您正在将Variable1的值(即空指针值(复制到func中,然后您正在修改该副本。因此CCD_ 22之外的CCD_ 21没有改变。对于有点倾向于指针的人来说,直接的解决方案是添加另一个间接级别。将指针传递到Variable1,然后通过该指针对其进行修改。像这样:

func(&Variable1);
void func(std::wstring** Variable2)
{
  *Variable2 = Variable3;
}

然而,这不是很好的风格。C++具有引用类型,允许您在不复制对象的情况下将对象传递到函数中,因此函数内部的对象与函数外部的对象相同。我们可以这样使用:

func(Variable1);
void func(std::wstring*& Variable2)
{
  Variable2 = Variable3;
}

CCD_ 24是对指针(由&表示(的引用。这意味着当您传递Variable1时,它不会被复制,并且Variable2指的是完全相同的指针。修改Variable2也会修改Variable1

你应该问自己的下一个问题是"我首先需要一个指向std::wstring的指针吗?"我不能为你回答这个问题,但通常答案是否定的。

然后neeext的问题是为什么要通过参数传递输出。这是一件非常C型的事情(但在这种情况下,即使他们也不会这么做(。这就是我们有返回值的原因。理想情况下,您的代码应该是这样的:

std::wstring Variable3 = SomeWStringObject;
int _tmain(int argc, _TCHAR* argv[])
{
  std::wstring Variable1 = func();
}
std::wstring func()
{
  return Variable3;
}

或者,您可能希望返回对Variable3的引用,在这种情况下,您的func返回类型应该是std::wstring&