Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.82
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

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

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

Почему ссылки считаются более хорошим средством, чем указатели?
Ведь если человек будет использовать сторонние классы, он может не заметить, скажем
int &val
и не будет знать, что передается ссылка, а вовсе не копия. Это может повлечь за собой кучу неприятностей. Даже сам разработчик может спустя время забыть о злополучном знаке &. Так почему ссылки лучше?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2012, 18:54     Ссылки vs Указатели
Посмотрите здесь:

Ссылки, указатели - C++
Доброго времени. Как, используя ссылки, указатели и, возможно, другие приемы сделать что-то вроде этого?: int a = 1; int b = 2; ...

Указатели и ссылки - C++
Экспериментируя с указателями пришел к вот таким выводам: int a; //переменная int *b; //указатель int &c = a //ссылка на <a> ...

Указатели и ссылки [С++] - C++
Всем привет. я тут программу делаю. Цель: определить,принадлежит ли точка заданному промежутку(а точнее лежит внутри или снаружи фигуры)....

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

Указатели и ссылки - C++
Собственно, не могу до конца осознать как это работает, вот пример из вики(комменты входят в пример) int n = 6; // Объявление...

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

Указатели и ссылки - C++
Используя вместо самой переменной указатель на нее написать программу в соответствии с заданием: Вычислить y = cos|x3-x2|.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 26
12.07.2012, 21:30     Ссылки vs Указатели #41
Цитата Сообщение от silent_1991 Посмотреть сообщение
Evg, не знаю, стоит ли считать каст в стиле Си (или reinterpret_cast) хакерством, но многие пейсатели любят юзать подобные штуки, не задумываясь о последствиях. Причём в продакшн-коде
Любое преобразование типов над указателями я считаю буратинством. При таком раскладе и на const в общем случае нельзя положиться

Цитата Сообщение от Jupiter Посмотреть сообщение
можно, вот только не факт что туда кто-то заглянет(а если заглянет, заметит!?), тогда как сигнатуру функции на 99.9% посмотрят
Когда стоит "func (&x)", то при определённых соглашениях даже смотреть никуда не надо, ибо надо исходить из того, что переменная будет модифицироваться
Catstail
Модератор
22445 / 10850 / 1766
Регистрация: 12.02.2012
Сообщений: 17,967
12.07.2012, 21:49     Ссылки vs Указатели #42
В С/C++ есть хорошее ключевое слово: BREAK !!!
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.07.2012, 23:15     Ссылки vs Указатели #43
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
ну не знаю, не видя полной сигнатуры функции с именами параметров все равно бывает сложно что-то сказать о функции

Добавлено через 19 секунд
Цитата Сообщение от Catstail Посмотреть сообщение
В С/C++ есть хорошее ключевое слово: BREAK !
а еще continue
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6419 / 3058 / 302
Регистрация: 04.12.2011
Сообщений: 8,332
Записей в блоге: 3
13.07.2012, 15:37     Ссылки vs Указатели #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, - если у програмера есть руки, вероятность их кривизны не равна нулю. Особенно если не смотреть, хотя бы сигнатуру.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.07.2012, 16:34     Ссылки vs Указатели #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);
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.07.2012, 17:05     Ссылки vs Указатели #46
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
Вызывая функцию, ты должен точно знать её назначение, а из него в любом случае будешь знать не только об изменении параметра, но и о характере этого изменения. А иначе опасна и передача по значению и даже вызов функции без параметров.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6419 / 3058 / 302
Регистрация: 04.12.2011
Сообщений: 8,332
Записей в блоге: 3
13.07.2012, 19:15     Ссылки vs Указатели #47
Цитата Сообщение от Deviaphan Посмотреть сообщение
Пример с массивом не корректен, т.к. он всегда как указатель передаётся.
Почему же некорректен? В месте вызова не видать ничего. А кто помешает в функции написать a=b; перед возвратом или a=b+10000; . Никто и не помешает.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.07.2012, 19:22     Ссылки vs Указатели #48
Цитата Сообщение от IGPIGP Посмотреть сообщение
Почему же некорректен?
Потому что массив по значению не передаётся.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
13.07.2012, 22:37     Ссылки vs Указатели #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;
}
//----------------------------------
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6419 / 3058 / 302
Регистрация: 04.12.2011
Сообщений: 8,332
Записей в блоге: 3
13.07.2012, 23:14     Ссылки vs Указатели #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;
}
смысл в том же, - функция получает указатели на тип, что бы вернуть один из них (или переустановить) но без доступа к значениям. Тогда внутри неё используются только имена формальных параметров и понять в месте объявления ничего не выйдет.
Мой опыт и знания не представляют ничего серьёзного и вопросы я задаю, для более глубокого понимания.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
13.07.2012, 23:33     Ссылки vs Указатели #51
Если размер объекта не больше размера указателя, то смысла применять указатель для повышения скорости работы нет.

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

Добавлено через 42 секунды
Цитата Сообщение от Avazart Посмотреть сообщение
к ней не применим const
В смысле???
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
14.07.2012, 06:32     Ссылки vs Указатели #53
В смысле???
В том смысле что он влияет на переменную, а не на саму ссылку.
Массивы ВООБЩЕ невозможно передать по значению. Синтаксис передачи по ссылке эквивалентен передаче по значению, поэтому такой пример не корректен был.
Это почему же?
(Хотя какой конкретно пример имеется ввиду?)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 06:36     Ссылки vs Указатели #54
Цитата Сообщение от Avazart Посмотреть сообщение
В том смысле что он влияет на переменную, а не на саму ссылку.
Ке?
C++
1
2
3
int a = 5;
const int & b = a;
a = 7;
Где влияние на переменную?

Цитата Сообщение от Avazart Посмотреть сообщение
Хотя какой конкретно пример имеется ввиду?
Тот, пример которого я переделал много постов тому назад.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
14.07.2012, 06:44     Ссылки vs Указатели #55
Ну в данном случае- игнор, а в этом- нет
C++
1
2
3
4
void f( const int& a )
 {
   a=10;
 }
И в этом
C++
1
int & const a= b ;
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 07:28     Ссылки vs Указатели #56
А где влияние на переменную? В обоих случаях это const ссылки.
В отличие от константного указателя и указателя на константу, константная ссылка и ссылка на константу это одно и то же.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
14.07.2012, 11:05     Ссылки vs Указатели #57
Ну либо выражение константная ссылка просто не отражает смысл также как
C++
1
const_iterator
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 11:18     Ссылки vs Указатели #58
Цитата Сообщение от Avazart Посмотреть сообщение
также как
Не так же. Пример с указателем приведён был выше. В частных случаях итератор и указатель равнозначны. Константная ссылка и ссылка на константу это одно и то же.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,279
Записей в блоге: 17
14.07.2012, 11:24     Ссылки vs Указатели #59
Также нелепо по тому как пишится const_iterator, а подразумевается итератор на константу
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2012, 11:27     Ссылки vs Указатели
Еще ссылки по теме:

Ссылки и указатели - C++
Добрый день. Возможно было. В чем существенная разница между передачей данных в функцию по ссылке или указателю. В каких случаях вы бы...

Ссылки и указатели - C++
Добрый день, не могу понять чем помогают при использовании указатели и ссылки? Есть код на c++ #progma once class well { ...

Ссылки и указатели - C++
Всем привет. Совсем запутался с ссылками и указателями. Помогите решать задачку: Функция принимает два аргумента, число с плавающей...

Указатели и ссылки? - C++
Ниже приведёна программы которая вызывает функцию. В функции происходит следующее создаются 2 массива в которые записыватся чётные и...

Указатели и ссылки - C++
Допустим, что есть функция, в которую мы кидаем массив по указателю и кол-ву элементов. void printArray(int *arr, int elements) ...


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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
14.07.2012, 11:27     Ссылки vs Указатели #60
Avazart, Ничего нелепого. В большинстве случаев это разные классы, которые по разному используются (в частности методы ->, * могут быть реализованы по разному и в const_iterator должны быть константами и возвращающими константу), как бы вы тогда назвали const_iterator, если такое название по вашему нелепо?
Yandex
Объявления
14.07.2012, 11:27     Ссылки vs Указатели
Ответ Создать тему
Опции темы

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