*&
От: F1aSh  
Дата: 04.12.05 16:42
Оценка:
Справка МСДН
Address-of Operator: &
When applied to functions or l-values, the result of the expression is a pointer type (an r-value) derived from the type of the operand. For example, if the operand is of type char, the result of the expression is of type pointer to char.

Пишу бинарное дерево... При добавлении нужно передавать корень (в смысле не сам корень а указатель типа node). Ничего подобно.. не работает....
вот так ::

void addNode(node *&root, int newItem) {
          if (Ampty) {
             root = new node( newItem );
             return;
          }
          else if ( newItem < root->data ) {
             addNode( root->left, newItem );
          }
          else {
             addNode( root->right, newItem );
          }
       }

работает...

Вопрос :: если & имеет результатом выражения указатель, то *& есть указатель на указатель ... так?

---->[]--->root


я чего то не понимаю... как тут что работает ... ? :D и почему не работает если просто написать *root ...


#define Ampty isAmpty(root)
int isAmpty (node *root) // дерево пусто 1, не пусто 0
{
    if (root == NULL)
        return 1;
    else 
        return 0;
}



int _tmain(int argc, _TCHAR* argv[])
{
    node f = node(7);
    addNode((node *&)f, 5);
    addNode((node *&)f, 3);
    cout << CountNodes(&f) << " node(s) in the tree" << endl;
    FindTarget(&f, 3);
    inOrder(&f);
    getch();
    return 0;
}
Re: *&
От: F1aSh  
Дата: 04.12.05 16:45
Оценка:
вот сама структура...


struct node {
    node *left;  
    node *right; 
    int data;
////// C
    node(int RootData)
    {
        data = RootData;
        left = NULL;
        right = NULL;
    }
////// D ~
    ~node()
    {
        delete root;
        delete left;
        delete right;
    }
} *root;



заодно вопрос — правильно ли я написал деструктор, ибо что то мне подсказывает что это хреновый деструктор... )) ибо он не удалит ВСЕ вершинки ... =(
Re: *&
От: pavel_turbin  
Дата: 04.12.05 16:56
Оценка:
Здравствуйте, F1aSh, Вы писали:

может так надо:

void addNode(node **root, int newItem) {
..
*root = new node( newItem );
...
}
Re: *&
От: korzhik Россия  
Дата: 04.12.05 17:00
Оценка:
Здравствуйте, F1aSh, Вы писали:

FS>Справка МСДН

FS>Address-of Operator: &
FS>When applied to functions or l-values, the result of the expression is a pointer type (an r-value) derived from the type of the operand. For example, if the operand is of type char, the result of the expression is of type pointer to char.

FS>Пишу бинарное дерево... При добавлении нужно передавать корень (в смысле не сам корень а указатель типа node). Ничего подобно.. не работает....

FS>вот так ::

FS>
FS>void addNode(node *&root, int newItem) {
FS>          if (Ampty) {
FS>             root = new node( newItem );
FS>             return;
FS>          }
FS>          else if ( newItem < root->data ) {
FS>             addNode( root->left, newItem );
FS>          }
FS>          else {
FS>             addNode( root->right, newItem );
FS>          }
FS>       } 
FS>

FS>работает...

FS>Вопрос :: если & имеет результатом выражения указатель, то *& есть указатель на указатель ... так?


нет не так. node*& root — ссылка на указатель на node.
И не Ampty, а Empty
Re: *&
От: g_i  
Дата: 04.12.05 17:38
Оценка:
Здравствуйте, F1aSh, Вы писали:


void fn(MyClass* c)
{
  c = new MyClass;
}

аргумент типа MyClass* передан по значению — следовательно, произойдет копирование переменной (имеющую тип "указатель на MyClass") и именно копии будет присвоено значение "new MyClass", в то время, как значение переданного аргумента останется неизменным (заодно утечет память).

void fn(MyClass*& c)
{
  c = new MyClass;
}

аргумент типа MyClass* передан по ссылке — копирование не произойдет, при выходе из функции переданный в нее аргумент будет инициализирован новым значением.

аналогично работает
void fn(MyClass** c)
{
  *c = new MyClass;
}
но проигрывает предыдущему примеру в удобочитаемости, на мой взгляд
Re[2]: *&
От: F1aSh  
Дата: 04.12.05 23:39
Оценка:
K>нет не так. node*& root — ссылка на указатель на node.

Указатель на ссылку на ноде блин.... че то я запутался... Вобщем, я так понял прикол в том что при выходе из процедуры у меня Меняется указатель на рут? Т.е. & меняет адресс, если он меняется... И становится рутом уже то, что я добавил ...

K>И не Ampty, а Empty

затупил )) я знал на самом деле это... Ну а чего говорить, если даже америкосы делают ошибки, то Русским не меньше позволено
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.