void test(int* arg)
{
*arg = 1;
}
void test(int& arg)
{
arg = 2;
}
//*не учитывая как осуществляется вызов 1 или 2 способ (результат тот же)
int x = 0;
test(&x); // 1
test(x); // 2
Вообще говоря - нет, не считая того, что в первую функцию можно передать несуществующий адрес (nullptr
), а во вторую - только имеющуюся переменную (в широком смысле слова, lvalue).
Обе функции абсолютно идентичные. Код из дизассемблера visual studio.
;void test(int& arg)
009E16B0 push ebp
009E16B1 mov ebp,esp
009E16B3 sub esp,0C0h
009E16B9 push ebx
009E16BA push esi
009E16BB push edi
009E16BC lea edi,[ebp-0C0h]
009E16C2 mov ecx,30h
009E16C7 mov eax,0CCCCCCCCh
009E16CC rep stos dword ptr es:[edi]
;arg = 2;
009E16CE mov eax,dword ptr [arg]
009E16D1 mov dword ptr [eax],2
;void test(int* arg)
009E16F0 push ebp
009E16F1 mov ebp,esp
009E16F3 sub esp,0C0h
009E16F9 push ebx
009E16FA push esi
009E16FB push edi
009E16FC lea edi,[ebp-0C0h]
009E1702 mov ecx,30h
009E1707 mov eax,0CCCCCCCCh
009E170C rep stos dword ptr es:[edi]
;*arg = 1;
009E170E mov eax,dword ptr [arg]
009E1711 mov dword ptr [eax],1
Конкретно для ваших функций _ как сказал Harry
, но когда видим в аргументе указатель, мы не знаем имеем ли мы дело с одним обьектом или с множеством таких обьектов. Любое арифметическое действие с указателем(если он не нулевой), приведет к тому, что мы будем работать уже с другим обьектом или с неопределенным участком памяти.
С аргументом ссылька, мы знаем, что в функцию передается конкретный обьект. Любое действие над ссылькой будет просто инвариантом обьекта, на который мы ссылались, поэтому безопасность обеспечена. Имея ввиду все это, всегда, когда имеете дело с конкретным одним обьектом, лучше работать со ссылькой, чем заморачиваться с указателем.
В случае с указателем с точки зрения клиента не очевидно, что переменная передается "по ссылке" (в том смысле, что копирования данных типа не происходит, в случае с настоящей C++-ссылкой это не так явно, ибо нет оператора взятия адреса &
)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Есть задание: Осуществить поиск указанного (с клавиатуры) элемента в массиве, используя указанный метод поиска)Метод поиска: Бинарный