Итак, у меня есть структура
struct node
{
node * l;
node * r;
};
Тогда есть
typedef node* tnode;
Что я не понять это функция:
void tsplit(tnode t, tnode &l, tnode &r, int x)
Как я понял, мы проходим t
в tsplit()
в качестве указателя на структуру, мы передаем две ссылки на указатели на структуры одного типа. Почему мы не можем просто передать указатели вместо их ссылок? Есть ли смысл?
Да, это имеет смысл. Как правило, вы можете рассматривать ссылки как указатели (с некоторыми ограничениями). Таким образом, вы можете изменить ссылки на указатели в вашем примере. Конечно, синтаксис также может измениться, но нам не нужно беспокоиться об этом. Ваш пример будет выглядеть так:
void tsplit(tnode t, tnode *l, tnode *r, int x)
Таким образом, разница в том, что вы можете изменить то, что находится под l
а также r
но нет t
, typedef абстрагирует его, но вы можете расширить его:
void tsplit(node* t, node** l, node** r, int x)
Теперь смысл в том, что вы можете изменить то, что находится под t
, но вы не можете изменить t
сам, вы можете сделать это с l
а также r
, Другими словами, вы не можете изменить контрольную цель t
, но вы можете сделать это с r
а также l
потому что у вас есть ссылка на ссылку (или указатель на указатель).
Зачем использовать ссылки над указателями? Потому что указатели также могут использоваться для разных вещей, например, для смены владельца объектов. Синтаксис будет выглядеть одинаково, но семантика сильно отличается. Людям нравится смотреть на то, как все выглядит, и сразу же знать, что это за намерение и смысл. То есть вычесть семантику из синтаксиса. Ссылки могут быть использованы только для передачи переменных, так что вы знаете, чего ожидать только от внешнего вида.
Ссылки позволяют tsplit()
манипулировать самими указателями, а не только содержимым того, на что указывает tnode
). Функция, вероятно, выделяет память или что-то подобное.
Это что-то типичное / классическое «возврат по ссылке» (также называется выходной параметр), и возвращаемые значения здесь являются указателями.
да, это имеет смысл, если вы выделяете новую память внутри void tsplit (tnode t, tnode &l, tnode &r, int x)
как t = новый структурный узел;
тогда это будет отражено только в том случае, если вы объявили его как ссылку на указатель.