Вопрос: Я передаю функции указатель, который она инициализирует
...
int *ip;
f(ip);
...

void f(ip)
int *ip;
{
  static int dummy = 5;
  ip = &dummy;
}

но указатель после вызова функции остается неизменным.

Ответ:
Функция пытается изменить сам указатель, или то, на что он ссылается?
Помните, что аргументы в С передаются по значению. Вызываемая функция изменяет только копию передаваемого указателя. Вам нужно либо передать адрес указателя (функцию будет в этом случае принимать указатель на указатель), либо сделать так, чтобы функция возвращала указатель.



Примечание:
out-параметры (параметры, изменяемые функцией) на C передаются по указателю:
void f(ip_ptr, i_ptr)
int **ip_ptr; /* out-параметр - указатель на статическую переменную */
int *i_ptr; /* out-параметр - целое число */
{
  assert(ip_ptr != NULL); /* Передан указатель на реально существующий приёмник типа int*. */
  assert(i_ptr != NULL);

  static int dummy = 5;

  /* присвоили значения приёмникам */
  *ip_ptr = &dummy;
  *i_ptr = rand();
}

...
int *ip;
int x;
f(&ip, &x);

В языке С++ можно передавать параметры по ссылке:
void f(int* &ip, int &i)
{
  static int dummy = 5;
  ip = &dummy;
  i = 123;
}

...
int *ip;
int i;
f(ip, i);

-- Кодт
Автор: Кодт    Оценить