首页 > 解决方案 > 具有两个间接运算符 (C++) 的函数参数的用途

问题描述

具有两个间接运算符的函数参数的目的是什么?

由于引用调用正在更改原始变量的值,我认为带有两个间接运算符的函数参数可能会更改原始值的地址。
但正如我在下面的尝试所示,它没有:


void addrchanger(int**);

int main()
{
    int value1 = 4;
    int* value1ptr = &value1;
    std::cout<<&value1<<std::endl;

    addrchanger(&value1ptr);
    std::cout<<&value1<<std::endl;
    //the address of value1 doesn't change.
}

void addrchanger(int** foo)
{
    //this is an attempt to change the address of value1 to the next slot
    ++**foo;
}

标签: c++functionparameters

解决方案


目的是传递指向指针的指针或指向数组的指针。对于 main() 之类的历史函数,这种做法类似于 C char** argv(这就是为什么您还需要一个 argc,因为指针不能推断出大小)。当您想要返回一个指针时也使用它,因此您将一个指针传递给一个指针,就像在许多 Win32 函数中一样。

例如在StringFromIID

HRESULT StringFromIID(
  REFIID   rclsid,
  LPOLESTR *lplpsz
);

您将传递一个双指针作为第二个参数(a wchar_t**),以便返回一个指针,它们必须像文档所说的那样被释放。

现在在 C++ 中完全避免这种情况,并在必要的任何深度使用 std::vector。


推荐阅读