powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ссылки и указатели - в чем разница?
12 сообщений из 12, страница 1 из 1
Ссылки и указатели - в чем разница?
    #32265451
ggg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос наверное тупой, но все-же..
В чем принципиальная разница между передачей аргументов в функцию по ссылке и указателю?
Т.е.
void f(int& a, int& b) { a=b; }
и
void f(int *a, int *b) { *a=*b; }
В книжке Ирэ Пол "ООП с использованием С++" написано, что существенной разницы как-бы никакой, но что-то мне подсказывает, что не зря введена дублирующая конструкция.
Спасибо.
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265466
Фотография osse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
imho, что-бы красивше было, если не требуется работать именно с указателем,
когда нужно только поменять значение аргумента или не пихать все значение в стек
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265491
ggg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы хотите сказать, что в случае использования ссылок уже сгенеренный код не будет содержать косвенной адресации, т.е. как минимум будет короче и быстрее?
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265502
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то понятие ссылок введено не столько для эффективности, сколько для типизации. Чтобы контроль усилить и от тяжкого наследия C - указателей подальше отойти... А код зависит от компилятора, но по идее, для ссылки компилятор еще работу с RTTI может примешать...
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265523
ggg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Mik Prokoshin.
А можно немного подробнее узнать про описанные вами причины? - что бы понять и проникнуться в суть?. Ведь если
я напишу *a=*b и они будут разных типов, то компилятор выдаст ошибку.
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265561
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg, брось эту книжку, возми Страуструпа :)
вся разница в семантике.
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265571
Фотография osse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Gcc
"Вы хотите сказать, что в случае использования ссылок уже сгенеренный код не будет содержать косвенной адресации, т.е. как минимум будет короче и быстрее?"

нет код будет практически одинаковым, про "красивше" я имел в виду, что
a = b приятнее выглядит чем *a = *b.

плюс к этому void f(int& a, int& b) лучше чем void f(int* a, int* b);
тем, что в теле функции в первом варианте не получится написать delete b;
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265577
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, начнем с того, что ссылка (reference) была введена для поддержки перегрузки операторов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class some
{
public:
    some(int i =  0 ) : i_(i) {}
    int i_;
};

some operator + (const some &a, const some &b)
{
     return some(a.i+b.i);
}

int main()
{
    some a( 10 );
    some b( 20 );
    some c = a + b;
}


Чтобы нас ожидало не будь ссылок? Неестественный на вид код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
some operator + (const some *a, const some *b)
{
     return some(*a.i+*b.i);
}

int main()
{
    some a( 10 );
    some b( 20 );
    some c = *a + *b;
}


Далее, указатель может быть равен 0 (указывать на несуществующий объект), тогда, как ссылка не может ссылаться на объект по адресу 0. Если вы выкините этот финт, ваша программа сразу же перейдет в разряд ill-formed:

Код: plaintext
1.
int *ptr =  0 ;
int& ref = *ptr; // ill-formed


По сути своей, ссылка - псевдоним переменной или константы в памяти. Ее нельзя переназначить, в отличие от указателя:

Код: plaintext
1.
2.
3.
int i =  0 ;
int &ref = i;
int j =  10 ;
ref = j; // присваиваем значение переменной i значение j, то есть i становиться равным  10 


Ну, и о том как ссылка обычно представляется компилятором:

Код: plaintext
T& == T*const;


Пожалуй, все.
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265604
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и еще : одна (а может и главная) цель ссылок - повысить надежность и читаемость программы. Например, чтобы не написать случайно (предположим int *a, int *b) *a+b или a=b Если есть выбор - конечно надо писать ссылки.
По реализации Широков все отлично написал :-)
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265615
Фотография osse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"По реализации Широков все отлично написал :-)"

присоединяюсь! Ж:-)
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265638
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавлю свои 5 копеек.

При выборе решения что использовать - ссылки или указатели правилом хорошего тона считается передавать по ссылке стековые объекты и статические объеты, а по указателям - созданные по new (malloc, calloc, ...).

Т.е. в прилежной программе необходимо определиться - с какими объектами будем работать по значению (т.е. создавать их в стеке или как статические переменные, или хранить в массивах и контейнерах по знаечению), а какие - создавать только по new. Ну и использовать для первых ссылки, а для вторых - указатели.

Корректное использование ссылок предполагает, что оперируемая ссылка никогда не ссылается на NULL, т.е. мы избавлены от необходимости проверять ее на NULL (типа &ref1==NULL). В то время как проверять на NULL указатели прилежная программа должна всегда. Если в программе "путаются" и перемешиваются объекты, создаваемые в стеке и в куче, то возможна неприятная ситуация - разыменование указателя для передачи по ссылке. Если указатель был равен NULL, то и ссылка будет ссылаться по этому адресу - в космос. И наша программка скромно упадет.
...
Рейтинг: 0 / 0
Ссылки и указатели - в чем разница?
    #32265895
ggg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем за очень подробные и содержательные ответы.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ссылки и указатели - в чем разница?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]