在什么情况下你可能想Foo **
在C++中使用多个间接(即指针链)?
@aku指出的最常见用法是允许在函数返回后更改指针参数.
#includeusing 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; }
这将打印
12
但是在下面的示例中还有其他一些有用的用法,用于迭代字符串数组并将它们打印到标准输出.
#includeusing 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; }
IMO最常见的用法是传递对指针变量的引用
void test(int ** var) { ... } int *foo = ... test(&foo);
您可以使用双指针创建多维锯齿状数组:
int ** array = new *int[2]; array[0] = new int[2]; array[1] = new int[3];
一种常见的情况是,您需要将空指针传递给函数,并在该函数内初始化,并在函数外部使用.没有multplie间接,调用函数永远不会访问初始化对象.
考虑以下功能:
initialize(foo* my_foo) { my_foo = new Foo(); }
任何调用'initialize(foo*)'的函数都无法访问Foo的初始化实例,因为传递给该函数的指针是一个副本.(毕竟,指针只是一个整数,整数按值传递.)
但是,如果函数定义如下:
initialize(foo** my_foo) { *my_foo = new Foo(); }
......这就是这样叫的......
Foo* my_foo; initialize(&my_foo);
...然后调用者可以通过'my_foo'访问初始化的实例 - 因为它是传递给'initialize'的指针的地址.
当然,在我的简化示例中,'initialize'函数可以通过return关键字简单地返回新创建的实例,但这并不总是适合 - 可能函数需要返回其他内容.