Передача структурного указателя на функцию

#c #pointers

#c #указатели

Вопрос:

У меня есть такая структура

 struct binTree{
long long data;
struct binTree *left;
struct binTree *right;
}
  

И функция, подобная этой:

 void height(struct binTree **r)
{
    ...
    ...
    height(amp;(r->left));
    height(amp;(r->right));
    ...
    ...
}
  

Компиляция вышеупомянутой функции выдает мне ошибку, подобную этой…

 error: request for member ‘left’ in ‘* r’, which is of non-class type ‘binTree*’
error: request for member ‘right’ in ‘* r’, which is of non-class type ‘binTree*’
  

В чем проблема с кодом? Как передать указатели, которые у меня есть внутри структуры?

Комментарии:

1. Почему height функция должна принимать binTree ** вместо just binTree * ? Вам нужно только двойное косвенное обращение, если вам нужно иметь возможность изменять входной указатель.

2. Я предлагаю вам изучить некоторые книги по C , чтобы уйти от C (или пометить вопрос только как C)

Ответ №1:

Вы должны написать

 height( amp;( ( *r )->left ) );
height( amp;( ( *r )->right ) );
  

Или более простой

 height( amp;( *r )->left );
height( amp;( *r )->right );
  

Здесь операторы amp; и * являются унарными операторами, которые имеют меньший приоритет, чем постфиксные операторы, включая operator ->

PS Поскольку эта функция, как я думаю, не изменяет объект BinTree, вы могли бы упростить функцию и объявить параметр просто как

 const struct binTree *r
  

или, если это программа на C , тогда

 const binTree *r
  

В этом случае синтаксические конструкции, используемые в функции, были бы проще.

Только я не понимаю, почему он имеет возвращаемый тип void.:) Разве функция не должна возвращать высоту двоичного дерева или высота выводится внутри тела функции? было бы лучше, если бы функция возвращала высоту. В этом случае вы могли бы, например, сравнить высоты двух двоичных деревьев.

Ответ №2:

Это более понятный синтаксис:

 void height(struct binTree **r)
{
    struct binTree* pr = *r;
    height( amp;pr->right );
    height( amp;pr->left );
}