изменить указатель, переданный по значению - PullRequest
3 голосов
/ 03 апреля 2011

Я дал функцию foo(struct node *n), где n - головной узел в связанном списке. Теперь foo должно измениться n s.t. это указывает на конец списка.

Но возможно ли это с помощью сигнатуры этой функции?

Предполагая, t является указателем на конец списка:

  • n = t не будет работать, потому что указатель передается по значению.
  • *n = *t не сработает, потому что я перезаписал бы заголовок списка.

Я что-то пропустил?

Ответы [ 6 ]

6 голосов
/ 03 апреля 2011

Вы должны использовать указатель на указатель:

foo(struct node **n) 

Чтобы изменить то, на что n указывает, вы делаете:

*n = t;
5 голосов
/ 03 апреля 2011

Нет, потому что у вас есть копия значения переданного указателя. У вас нет доступа к переданному исходному указателю. Чтобы изменить указатель вне функции, sig должен быть foo (узел структуры ** n).

4 голосов
/ 03 апреля 2011

Нет, вы не можете изменить любой аргумент, передаваемый по значению.

4 голосов
/ 03 апреля 2011

Вы ничего не пропустили.Это невозможно с данным объявлением функции.

Как вы писали, указатель передается по значению, поэтому при изменении он не будет распространяться на исходную переменную.

Вам необходимо изменитьпрототип к foo(struct node **n); или struct node *foo(struct node *n); и вернуть новый указатель как результат.

1 голос
/ 03 апреля 2011

Вы не можете изменить n, и вызывающий абонент увидит изменение.Вы можете изменить n->prev->next и n->next->prev, хотя - это может быть то, что вам нужно.

0 голосов
/ 03 апреля 2011

Невозможно отразить изменение в вызывающей функции. Тем не менее, внутри foo вы можете изменить n на свое усмотрение.

int foo(struct node *n) {
    n = NULL; /* ok */
}
...