В одном распространенном сценарии вам нужно передать указатель null на функцию, инициализировать его внутри этой функции и использовать вне функции. Без косвенного перенаправления вызывающая функция никогда не имела бы доступа к инициализированному объекту.
Рассмотрим следующую функцию:
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' могла бы просто возвращать вновь созданный экземпляр через ключевое слово return, но это не всегда подходит - возможно, функция должна возвращать что-то еще.