Есть ли разница ... между ptr ** и ptr * & ...
Да. Первый является указателем на объект типа ptr*
, а второй - ссылкой на объект типа ptr*
.
или предпочтительнее ...
void change(int** ptr) {
**ptr = 50;
*ptr = nullptr;
}
void change(int*& ptr) {
*ptr = 50;
ptr = nullptr;
}
Преимущества справки
Вы обнаружите, что ссылка неявно перенаправлена, что упрощает синтаксис и обычно способствует удобочитаемости. Это особенно важно в случае ссылки / указателя на указатель. То же самое относится и к получению справки: вам не нужно использовать оператор адреса.
Другое преимущество состоит в том, что ссылка не может быть переназначена для ссылки на другой объект. Это упрощает чтение программ, использующих ссылки, поскольку вам не нужно выяснять, переназначена ли ссылка в длинном алгоритме; Вы знаете, что это не так.
Еще одним преимуществом является то, что ссылка не может быть нулевой. Поэтому вам не нужно проверять такую возможность внутри функции. Если вы передадите null в первую примерную функцию, поведение будет неопределенным, что очень плохо.
Недостатки справки
Вы обнаружите, что ссылка неявно перенаправлена. Это может сбивать с толку людей, знакомых только с типами значений (программисты на Си).
Другим недостатком является то, что ссылка не может быть переназначена для ссылки на другой объект. Похоже, что это не проблема для вашей функции, так как вам не нужно ссылаться на более чем один объект, но в целом есть ситуации, когда это будет полезно.
Другим недостатком является то, что ссылка не может быть нулевой. Похоже, что это не проблема для вашей функции, которая, по-видимому, никогда не предназначена для обработки такого случая. Но в целом, существуют ситуации, когда вы хотите представить ссылочное отношение к несуществующему объекту.
Предпочтения являются личными, но, на мой взгляд, преимущества ссылки перевешивают недостатки, за исключением тех случаев, когда вам нужна одна из невозможных функций (обнуляемость, переназначение)