2011-01-07 4 views
7

Указатель, передаваемый по ссылке. Зачем? не являются указателями, просто ссылки в любом случае? Что на самом деле происходит с этим параметром?C++ Pointer (Pass By Reference) Вопрос

void someFunc(MyPtr*& Object) 
{ 

} 
+1

«Не являются указателями в любом случае?» Здесь есть небольшая двусмысленность. В общих терминах компьютерной науки указатели являются своего рода ссылкой.Однако C++ использует одно и то же слово «ссылка» для обозначения конкретной языковой функции. Ссылки на C++ также являются своего рода ссылкой, но они являются * различной * ссылкой, а указатели не являются ссылками на C++. –

+0

@ Стив Джессоп: +1 аналогичные причины заставили меня написать мой ответ тоже. Ref Vs Pointer nice visual doc -> http://www.dgp.toronto.edu/~patrick/csc418/wi2004/notes/PointersVsRef.pdf просто кажется, что это всегда вызывает много путаницы. Аналогичная вещь находится в C#, но много poeple не понимают, что есть даже проблема - на самом деле это еще сложнее, чем C++, поскольку pass by ref & pass by value идет потому, что имеет логические уровни поверх концепций C++. Слишком плохо некоторые люди понимают, что C# на самом деле более сложна, чем C++, когда дело доходит до того, что такое «указатели» (не говоря уже о небезопасном коде вообще) – user44298

+0

продолжение. Но с другой стороны это очень просто, если вы думаете об этом так: когда компьютеры хранят данные (например, переменная), данные имеют только 2 характеристики: (1) адрес в memeory & (2) значение, написанное по этому адресу , Это любые данные. Указатели и ссылки и такие абстракции введены для удобства. Например, любой носитель, который хранит такие данные, как DVD, такие же, как и бумажная книга: у вас есть страница, на которой у вас есть написанное предложение - это тоже самое - вам нужно написать (1) информацию (2) где-нибудь. Сны с другой стороны могут быть более сложными по мере хранения :) – user44298

ответ

7

Проще говоря, это дает вам возможность изменить сам указатель: он может быть изменен, чтобы указать на другое место в этой функции. И изменение будет отражено снаружи.

1

Другим нужно будет проголосовать, чтобы подтвердить эту причину. Я немного ржавый на своем C++, но я считаю, что идея здесь заключается в том, что вы передадите указатель по ссылке, вместо того, чтобы создавать новое пространство для хранения указатель сам использует ссылку на указатель, поэтому, если вы должны изменить указатель, а не только значение, которое оно будет изменено после возврата из функции, в противном случае все, что вы могли бы сделать, это изменить значение в переданной позиции. Надеюсь, что это имеет смысл ,

0

Это также означает, что указатель может быть 0 (NULL), который может иметь смысл для метода. Ссылка всегда должна быть действительной и не может быть сделана «ничего»

1

Разница в простом указателе заключается в том, что при изменении указателя (Object = x) это изменение будет отображаться вызывающей функцией. Вы можете достичь того же, когда пройдете MyPtr** Object и разыщите указатель *Object = x;. При втором подходе вы можете передать NULL функции. Это невозможно для ссылок.

5

Это позволит вам:

void someFunc(MyPtr*& Object) 
{ 
    //Modify what Object is pointing to 
    Object=&old_Object; 

    //You can also allocate memory, depending on your requirements 
    Object=new MyPtr; 

    //Modify the variable Object points to 
    *Object=another_object; 
} 
+0

У нас нет утечки памяти в вышеуказанной ситуации? – Mahesh

+1

@Mahesh Нет, если вызывающий абонент знает, что он должен удалить новый объект, когда он закончит с ним – trojanfoe

1

Вы не совсем правы. Указатель содержание передается по ссылке, но сам указатель по-прежнему передается по значению, т. Е. Его повторное связывание с каким-либо другим указателем не отражается на выходе из метода, потому что указатель будет указывать на тот же блок памяти, что и перед вызовом. Подумайте об этом как о простой переменной int. Однако с & * или ** вы можете переназначить указатель, и это будет видно за пределами этого метода.

1

Почему?

По той же причине, что и в другом месте по ссылке.

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

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

Ссылки являются гораздо более простой и понятной концепцией, и есть только «исторические причины» для попытки понять указатели перед ними. Современный C++ использует исходные указатели только в редких случаях и как можно больше рассматривает их как детали реализации.

Ссылка на другое название уже существующей вещи. Вот и все. При использовании в качестве параметра функции они позволяют вызываемой функции ссылаться на данные вызывающего абонента.