Справка МСДН
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;
}
вот сама структура...
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;
заодно вопрос — правильно ли я написал деструктор, ибо что то мне подсказывает что это хреновый деструктор... )) ибо он не удалит ВСЕ вершинки ... =(
Здравствуйте, F1aSh, Вы писали:
может так надо:
void addNode(node **root, int newItem) {
..
*root = new node( newItem );
...
}
Здравствуйте, 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
Здравствуйте, 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;
}
но проигрывает предыдущему примеру в удобочитаемости, на мой взгляд