Указатель, передаваемый по ссылке. Зачем? не являются указателями, просто ссылки в любом случае? Что на самом деле происходит с этим параметром?C++ Pointer (Pass By Reference) Вопрос
void someFunc(MyPtr*& Object)
{
}
Указатель, передаваемый по ссылке. Зачем? не являются указателями, просто ссылки в любом случае? Что на самом деле происходит с этим параметром?C++ Pointer (Pass By Reference) Вопрос
void someFunc(MyPtr*& Object)
{
}
Проще говоря, это дает вам возможность изменить сам указатель: он может быть изменен, чтобы указать на другое место в этой функции. И изменение будет отражено снаружи.
Другим нужно будет проголосовать, чтобы подтвердить эту причину. Я немного ржавый на своем C++, но я считаю, что идея здесь заключается в том, что вы передадите указатель по ссылке, вместо того, чтобы создавать новое пространство для хранения указатель сам использует ссылку на указатель, поэтому, если вы должны изменить указатель, а не только значение, которое оно будет изменено после возврата из функции, в противном случае все, что вы могли бы сделать, это изменить значение в переданной позиции. Надеюсь, что это имеет смысл ,
Это также означает, что указатель может быть 0 (NULL), который может иметь смысл для метода. Ссылка всегда должна быть действительной и не может быть сделана «ничего»
Разница в простом указателе заключается в том, что при изменении указателя (Object = x
) это изменение будет отображаться вызывающей функцией. Вы можете достичь того же, когда пройдете MyPtr** Object
и разыщите указатель *Object = x;
. При втором подходе вы можете передать NULL функции. Это невозможно для ссылок.
Это позволит вам:
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;
}
Вы не совсем правы. Указатель содержание передается по ссылке, но сам указатель по-прежнему передается по значению, т. Е. Его повторное связывание с каким-либо другим указателем не отражается на выходе из метода, потому что указатель будет указывать на тот же блок памяти, что и перед вызовом. Подумайте об этом как о простой переменной int. Однако с & * или ** вы можете переназначить указатель, и это будет видно за пределами этого метода.
Почему?
По той же причине, что и в другом месте по ссылке.
не являются указателями, просто ссылки в любом случае?
Дорогой бог, нет. Даже не отдаленно то же самое. Посмотрите, вы можете попробуйте, чтобы построить ментальную модель ссылки на , начиная с указателем, но к тому времени, когда вы исправили все различия, у вас ужасный нелогичный беспорядок.
Ссылки являются гораздо более простой и понятной концепцией, и есть только «исторические причины» для попытки понять указатели перед ними. Современный C++ использует исходные указатели только в редких случаях и как можно больше рассматривает их как детали реализации.
Ссылка на другое название уже существующей вещи. Вот и все. При использовании в качестве параметра функции они позволяют вызываемой функции ссылаться на данные вызывающего абонента.
«Не являются указателями в любом случае?» Здесь есть небольшая двусмысленность. В общих терминах компьютерной науки указатели являются своего рода ссылкой.Однако C++ использует одно и то же слово «ссылка» для обозначения конкретной языковой функции. Ссылки на C++ также являются своего рода ссылкой, но они являются * различной * ссылкой, а указатели не являются ссылками на C++. –
@ Стив Джессоп: +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
продолжение. Но с другой стороны это очень просто, если вы думаете об этом так: когда компьютеры хранят данные (например, переменная), данные имеют только 2 характеристики: (1) адрес в memeory & (2) значение, написанное по этому адресу , Это любые данные. Указатели и ссылки и такие абстракции введены для удобства. Например, любой носитель, который хранит такие данные, как DVD, такие же, как и бумажная книга: у вас есть страница, на которой у вас есть написанное предложение - это тоже самое - вам нужно написать (1) информацию (2) где-нибудь. Сны с другой стороны могут быть более сложными по мере хранения :) – user44298