указатель и ссылка как в аргументах - PullRequest
1 голос
/ 05 марта 2012

Я видел в нескольких кодах дерева, что функция класса дерева имеет как *, так и & с узлом, например, для вставки узла в BST функция выглядит так

insertnode(node * &t,string value)
{
t = new node; t-> val = value 
// code to find right place in BST
}

Я хочу знатьпочему мы передаем ссылку на указатель в целом, а также в частности на этот случай.Пожалуйста, также укажите, есть ли другой сценарий этого, спасибо

Вместо того, чтобы публиковать другой вопрос.Может ли кто-то также указать на использование класса объекта?я имею в виду, используя экземпляры класса объекта, он выделил всю память, ушедшую для всех подклассов?то есть int float и т. д. и т. д.

Ответы [ 7 ]

6 голосов
/ 05 марта 2012

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

void foo(int* x)
{
   x = new int[1];
}

void goo(int*& x)
{
   x = new int[1];
}

int* x = NULL;
foo(x);
//x is NULL here, and you also have a memory leak
goo(x);
//x points to an array of 1 int

В вашем случае вы передаете ссылку на указатель, потому что вы хотите изменить исходный указатель. Изменение указателя не означает изменение значения, на которое он указывает, но изменение адреса, на который он указывает.

3 голосов
/ 05 марта 2012

Если вы манипулируете параметром указателя в функции, значение указателя не будет сохранено после возврата из функции. Но если вы передадите указатель по ссылке, ссылка на новый адрес будет сохранена после возврата:

void foo1(int* x)
{
    x = new int(2);
}

void foo2(int* &x)
{
    x = new int(3);
}
int main()
{
    int* x = new int(1);
    foo1(x);
    printf("x = %d\n", *x); // x = 1 => x is not referring to a new address after returning from foo1()
    foo2(x);
    printf("x = %d\n", *x); // x = 3 => x is referring to a new address after returning from foo2()
    return 0;
}

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

1 голос
/ 05 марта 2012

Это в значительной степени эквивалентно следующему, но несколько короче и, возможно, легче анализировать визуально:

insertnode(node** t, string value)
{
  *t = new node;
  (*t)->val = value;
}
0 голосов
/ 05 марта 2012

когда вы объявляете функцию, подобную этой:

foo(node* param);

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

в то время как если вы передадитепараметр:

foo(node*& param);

у вас есть указатель, переданный по ссылке, поэтому у вас есть псевдоним указателя!псевдоним означает тот же указатель с другим именем.

0 голосов
/ 05 марта 2012

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

У вас есть пример здесь: http://msdn.microsoft.com/en-us/library/1sf8shae%28v=vs.80%29.aspx

0 голосов
/ 05 марта 2012

Передача указателя по ссылке позволяет функции изменять указатель напрямую. В этом конкретном случае указатель указывает на вновь созданный node.

0 голосов
/ 05 марта 2012

Это означает, что функция может изменять указатель (т.е. изменять, куда он указывает).

...