Помните, что C передает все аргументы функции по значению - это означает, что формальный параметр в теле функции является отдельным объектом в памяти от фактического параметра в вызове функции, и значением фактический параметр копируется в формальный параметр.
Чтобы любая функция могла изменить значение параметра, вы должны передать этому параметру указатель :
void foo( T *ptr ) // for any type T
{
*ptr = new_T_value(); // write a new value to the thing ptr points to
}
void bar( void )
{
T var;
foo( &var ); // write a new value to var
}
В приведенном выше коде все следующие true:
ptr == &var
*ptr == var
Таким образом, когда вы записываете новое значение в выражение *ptr
, это то же самое, что записывать новое значение в var
.
Я думаю, что отчасти это сбивает вас с толку, так как имена ваших формальных параметров (a
и b
) и ваших указателей (a
и b
) переворачиваются - g:a
указывает на main:b
и наоборот.
g:a == &main:b // I'm using g: and main: here strictly to disambiguate
*g:a == main:b // which a and b I'm talking about - this is not based on
// any real C syntax.
g:b == &main:a
*g:b == main:a