Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.97/30: Рейтинг темы: голосов - 30, средняя оценка - 4.97
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
1

Ссылки vs Указатели

10.07.2012, 18:54. Просмотров 6089. Ответов 81
Метки нет (Все метки)

Почему ссылки считаются более хорошим средством, чем указатели?
Ведь если человек будет использовать сторонние классы, он может не заметить, скажем
int &val
и не будет знать, что передается ссылка, а вовсе не копия. Это может повлечь за собой кучу неприятностей. Даже сам разработчик может спустя время забыть о злополучном знаке &. Так почему ссылки лучше?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2012, 18:54
Ответы с готовыми решениями:

Указатели и ссылки c++
Здравствуйте! Не могли бы вы объяснить как можно использовать ссылки и указатели c++ на практике? Я...

Указатели и ссылки
Добрый день, есть вопросы по поводу указателей и ссылок в параметрах функций. Правильно ли я...

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

Ссылки и указатели
#include <iostream> using namespace std; int main() { int *n=new int{1,2};...

81
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
12.07.2012, 21:30 41
Цитата Сообщение от silent_1991 Посмотреть сообщение
Evg, не знаю, стоит ли считать каст в стиле Си (или reinterpret_cast) хакерством, но многие пейсатели любят юзать подобные штуки, не задумываясь о последствиях. Причём в продакшн-коде
Любое преобразование типов над указателями я считаю буратинством. При таком раскладе и на const в общем случае нельзя положиться

Цитата Сообщение от Jupiter Посмотреть сообщение
можно, вот только не факт что туда кто-то заглянет(а если заглянет, заметит!?), тогда как сигнатуру функции на 99.9% посмотрят
Когда стоит "func (&x)", то при определённых соглашениях даже смотреть никуда не надо, ибо надо исходить из того, что переменная будет модифицироваться
0
Модератор
Эксперт Python
26652 / 13899 / 2643
Регистрация: 12.02.2012
Сообщений: 22,782
Записей в блоге: 1
12.07.2012, 21:49 42
В С/C++ есть хорошее ключевое слово: BREAK !!!
0
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
12.07.2012, 23:15 43
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
ну не знаю, не видя полной сигнатуры функции с именами параметров все равно бывает сложно что-то сказать о функции

Добавлено через 19 секунд
Цитата Сообщение от Catstail Посмотреть сообщение
В С/C++ есть хорошее ключевое слово: BREAK !
а еще continue
1
Комп_Оратор)
Эксперт по математике/физике
8389 / 4145 / 567
Регистрация: 04.12.2011
Сообщений: 12,298
Записей в блоге: 14
13.07.2012, 15:37 44
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
А если в функции нет обращения, а только выбор и возврат:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int* foo(int* a, int* b, int c);//декл
 
//----------------------------------
//вызов:
int a[3]={1};
int b[3]={5};
cout<<foo(a, b, 0); //что в месте вызова видно?
 
//--------------------
//опр
int* foo(int* a, int* b, int c){
if(c) return a;
return b;
}
Согласен с alex_x_x, - если у програмера есть руки, вероятность их кривизны не равна нулю. Особенно если не смотреть, хотя бы сигнатуру.
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
13.07.2012, 16:34 45
Цитата Сообщение от IGPIGP Посмотреть сообщение
А если в функции нет обращения, а только выбор и возврат:
Пример с массивом не корректен, т.к. он всегда как указатель передаётся. А вот если использовать объекты:
C++
1
2
3
4
5
6
7
8
9
10
11
A* func1( A* a, A *b, int c );
 
A& func2(A&a, A&b, int c)
{
    return c ? a : b;
}
 
A a,b;
 
cout << *func1(&a,&b,0);
cout << func2(a,b,0);
0
4194 / 1787 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
13.07.2012, 17:05 46
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
Вызывая функцию, ты должен точно знать её назначение, а из него в любом случае будешь знать не только об изменении параметра, но и о характере этого изменения. А иначе опасна и передача по значению и даже вызов функции без параметров.
1
Комп_Оратор)
Эксперт по математике/физике
8389 / 4145 / 567
Регистрация: 04.12.2011
Сообщений: 12,298
Записей в блоге: 14
13.07.2012, 19:15 47
Цитата Сообщение от Deviaphan Посмотреть сообщение
Пример с массивом не корректен, т.к. он всегда как указатель передаётся.
Почему же некорректен? В месте вызова не видать ничего. А кто помешает в функции написать a=b; перед возвратом или a=b+10000; . Никто и не помешает.
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
13.07.2012, 19:22 48
Цитата Сообщение от IGPIGP Посмотреть сообщение
Почему же некорректен?
Потому что массив по значению не передаётся.
0
Эксперт С++
8301 / 6055 / 602
Регистрация: 10.12.2010
Сообщений: 28,143
Записей в блоге: 26
13.07.2012, 22:37 49
Цитата Сообщение от novi4ok Посмотреть сообщение
принципиальной разницы нет. просто другая форма записи. все равно при использовании ссылки на самом деле указатель передается. я предпочитаю ссылками не пользоваться, но когда у кого-то в ф-ии встречается - не имею проблем.
Ну это не так. Под ссылку даже память может не выделяться, она также не может иметь своего адреса, к ней не применим const, нельзя применить ссылку на ссылку и др.комбинации.Единственное что можно зделать - инициализировать.
Думаю что достаточно различий что бы не говорить что ссылка это тот же указатель.

Добавлено через 10 минут
Потому что массив по значению не передаётся.
Зато можно по ссылке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//----------------------------------
void f(int (&A)[10] )
{
 A[5]=55;
}
//----------------------------------
int main()
{
int A[10],B[11];
 
f(A);
//f(B);  // Ошибка не тот размерчик :)
 
cout<<A[5]<<endl; // 55
 
return 0;
}
//----------------------------------
0
Комп_Оратор)
Эксперт по математике/физике
8389 / 4145 / 567
Регистрация: 04.12.2011
Сообщений: 12,298
Записей в блоге: 14
13.07.2012, 23:14 50
Цитата Сообщение от Avazart Посмотреть сообщение
Ну это не так. Под ссылку даже память может не выделяться, она также не может иметь своего адреса, к ней не применим const, нельзя применить ссылку на ссылку и др.комбинации.Единственное что можно зделать - инициализировать.
Avazart, тут и спора нет. Ссылка не тот же указатель, но ведет себя как указатель с урезанными правами. Она const по определению, поэтому и не стоит ее объявлять как константу, а ссылаться на константу вполне может. Но везде где используется ссылка может быть использован указатель, но с дополнительными операциями * разименования. На ооборот - нет. Но смысл ссылки, как она задумана, в доступе к значению. Удобство в том, что если требуется адрес она автоматически предоставляет адрес без *. Но ведь указатель же может быть передан и для работы с указателем как таковым?
Deviaphan, массивы передаются по ссылке. Ну и что? А объекты которые созданы через указатели:
C++
1
A* b = new A();
Легко переписать:
A* foo(A* a, A* b, int c);//декл

//----------------------------------
//вызов:
C++
1
2
3
4
5
6
7
8
9
10
A* a = new A();
A* b = new A();
cout<<foo(a, b, 0); //что в месте вызова видно?
 
//--------------------
//опр
A* foo(A* a, A* b, int c){
if(c) return a;
return b;
}
смысл в том же, - функция получает указатели на тип, что бы вернуть один из них (или переустановить) но без доступа к значениям. Тогда внутри неё используются только имена формальных параметров и понять в месте объявления ничего не выйдет.
Мой опыт и знания не представляют ничего серьёзного и вопросы я задаю, для более глубокого понимания.
0
Эксперт С++
8301 / 6055 / 602
Регистрация: 10.12.2010
Сообщений: 28,143
Записей в блоге: 26
13.07.2012, 23:33 51
Если размер объекта не больше размера указателя, то смысла применять указатель для повышения скорости работы нет.

Ну и конструкция
C++
1
int const *const
сильно грамосткая
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 06:29 52
Цитата Сообщение от IGPIGP Посмотреть сообщение
массивы передаются по ссылке. Ну и что?
Массивы ВООБЩЕ невозможно передать по значению. Синтаксис передачи по ссылке эквивалентен передаче по значению, поэтому такой пример не корректен был.

Добавлено через 42 секунды
Цитата Сообщение от Avazart Посмотреть сообщение
к ней не применим const
В смысле???
0
Эксперт С++
8301 / 6055 / 602
Регистрация: 10.12.2010
Сообщений: 28,143
Записей в блоге: 26
14.07.2012, 06:32 53
В смысле???
В том смысле что он влияет на переменную, а не на саму ссылку.
Массивы ВООБЩЕ невозможно передать по значению. Синтаксис передачи по ссылке эквивалентен передаче по значению, поэтому такой пример не корректен был.
Это почему же?
(Хотя какой конкретно пример имеется ввиду?)
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 06:36 54
Цитата Сообщение от Avazart Посмотреть сообщение
В том смысле что он влияет на переменную, а не на саму ссылку.
Ке?
C++
1
2
3
int a = 5;
const int & b = a;
a = 7;
Где влияние на переменную?

Цитата Сообщение от Avazart Посмотреть сообщение
Хотя какой конкретно пример имеется ввиду?
Тот, пример которого я переделал много постов тому назад.
0
Эксперт С++
8301 / 6055 / 602
Регистрация: 10.12.2010
Сообщений: 28,143
Записей в блоге: 26
14.07.2012, 06:44 55
Ну в данном случае- игнор, а в этом- нет
C++
1
2
3
4
void f( const int& a )
 {
   a=10;
 }
И в этом
C++
1
int & const a= b ;
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 07:28 56
А где влияние на переменную? В обоих случаях это const ссылки.
В отличие от константного указателя и указателя на константу, константная ссылка и ссылка на константу это одно и то же.
0
Эксперт С++
8301 / 6055 / 602
Регистрация: 10.12.2010
Сообщений: 28,143
Записей в блоге: 26
14.07.2012, 11:05 57
Ну либо выражение константная ссылка просто не отражает смысл также как
C++
1
const_iterator
0
Делаю внезапно и красиво
Эксперт С++
1309 / 1224 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 11:18 58
Цитата Сообщение от Avazart Посмотреть сообщение
также как
Не так же. Пример с указателем приведён был выше. В частных случаях итератор и указатель равнозначны. Константная ссылка и ссылка на константу это одно и то же.
0
Эксперт С++
8301 / 6055 / 602
Регистрация: 10.12.2010
Сообщений: 28,143
Записей в блоге: 26
14.07.2012, 11:24 59
Также нелепо по тому как пишится const_iterator, а подразумевается итератор на константу
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
14.07.2012, 11:27 60
Avazart, Ничего нелепого. В большинстве случаев это разные классы, которые по разному используются (в частности методы ->, * могут быть реализованы по разному и в const_iterator должны быть константами и возвращающими константу), как бы вы тогда назвали const_iterator, если такое название по вашему нелепо?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2012, 11:27

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

Указатели и ссылки
Собственно, не могу до конца осознать как это работает, вот пример из вики(комменты входят в...

Указатели и Ссылки
извеняюсь,но никак не могу понять. int sum(int* inLeft, int* inRight) { if(inLeft ==...

Указатели и ссылки
Допустим, что есть функция, в которую мы кидаем массив по указателю и кол-ву элементов. void...

Ссылки и указатели
Здравствуйте, может кто объяснить в чем будет отличие при передаче в функцию по **, *, *&amp;, &amp;(**),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.