Jor*_*ira 12
@aku指出的最常见用法是允许在函数返回后更改指针参数.
#include <iostream>
using namespace std;
struct Foo {
int a;
};
void CreateFoo(Foo** p) {
*p = new Foo();
(*p)->a = 12;
}
int main(int argc, char* argv[])
{
Foo* p = NULL;
CreateFoo(&p);
cout << p->a << endl;
delete p;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这将打印
12
Run Code Online (Sandbox Code Playgroud)
但是在下面的示例中还有其他一些有用的用法,用于迭代字符串数组并将它们打印到标准输出.
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
const char* words[] = { "first", "second", NULL };
for (const char** p = words; *p != NULL; ++p) {
cout << *p << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
IMO最常见的用法是传递对指针变量的引用
void test(int ** var)
{
...
}
int *foo = ...
test(&foo);
Run Code Online (Sandbox Code Playgroud)
您可以使用双指针创建多维锯齿状数组:
int ** array = new *int[2];
array[0] = new int[2];
array[1] = new int[3];
Run Code Online (Sandbox Code Playgroud)
一种常见的情况是,您需要将空指针传递给函数,并在该函数内初始化,并在函数外部使用.没有multplie间接,调用函数永远不会访问初始化对象.
考虑以下功能:
initialize(foo* my_foo)
{
my_foo = new Foo();
}
Run Code Online (Sandbox Code Playgroud)
任何调用'initialize(foo*)'的函数都无法访问Foo的初始化实例,因为传递给该函数的指针是一个副本.(毕竟,指针只是一个整数,整数按值传递.)
但是,如果函数定义如下:
initialize(foo** my_foo)
{
*my_foo = new Foo();
}
Run Code Online (Sandbox Code Playgroud)
......这就是这样叫的......
Foo* my_foo;
initialize(&my_foo);
Run Code Online (Sandbox Code Playgroud)
...然后调用者可以通过'my_foo'访问初始化的实例 - 因为它是传递给'initialize'的指针的地址.
当然,在我的简化示例中,'initialize'函数可以通过return关键字简单地返回新创建的实例,但这并不总是适合 - 可能函数需要返回其他内容.