TL / DR - Для того, что вы пытаетесь сделать, helperFunction1
и helperFunction2
объявлены правильно, вам просто нужно использовать правильные имена в helperFunction1
.
Более длинная версия
Если вы хотите, чтобы ваша функция изменила сам объект-указатель , то вы должны передать указатель на этот указатель. Вот надуманный пример, в котором мы хотим обновить объект FILE *
:
void open( FILE **ptr, const char *name, const char *mode )
{
*ptr = fopen( name, mode );
}
int main( void )
{
FILE *in; // in stores the address of a FILE object
FILE *out; // out stores the address of a FILE object
open( &in, "input.txt", "r" ); // we are changing the values of in and out
open( &out, "output.txt", "w" ); // so we must pass pointers to those objects
...
}
Мы хотим, чтобы open
изменил объекты in
и out
, поэтому мы передаем указатели на эти объекты.
Сравните это с чем-то вроде этого:
void write( FILE *ptr, const char *text )
{
fwrite( ptr, "%s", text );
}
В этом случае мы не пытаемся изменить сам указатель файла, мы просто пытаемся записать в FILE
поток, на который он указывает, поэтому нам не нужно беспокоиться о указателе на указатель в этом случае. Другой надуманный пример:
int main( void )
{
FILE *out;
...
write( out, "some text" ); // we are not changing the value of out,
... // so we do not pass a pointer to it
}
Для любого типа T
, если мы хотим, чтобы функция модифицировала объект этого типа, мы должны передать указатель на этот объект:
void foo( T *ptr )
{
*ptr = new_T_value(); // write a new value to the thing ptr points to
}
int main( void )
{
T var;
foo( &var ); // write a new value to var
}
Это работает точно так же для типов указателей - замените T
на P *
:
void foo( P * *ptr ) // or just P **ptr
{
*ptr = new_Pstar_value(); // write a new *pointer* value to the thing ptr points to
}
int main( void )
{
P * var;
foo( &var ); // write a new value to var
}
Опять же, это верно только в том случае, если вы хотите изменить значение из var
.
Вы можете go с еще более высоким уровнем косвенности - замените P
на Q *
:
void foo( Q * * *ptr ) // or just Q ***ptr
{
*ptr = new_Qstarstar_value(); // write a new *pointer* value to the thing ptr points to
}
int main( void )
{
Q * * var; // or just Q **var
foo( &var ); // write a new value to var
}
Выражение *ptr
в foo
имеет тот же тип, что и выражение var
в main
, поэтому запись в *ptr
эквивалентна записи в var
.