|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
16.01.2012, 14:03 | #1 |
Пользователь
Регистрация: 05.12.2010
Сообщений: 14
|
указатели и ссылки
я путаюсь в указателях и ссылках, объясните пожалуйста, почему в этой программе они используются? как они взаимодействуют?
Код:
|
16.01.2012, 14:36 | #2 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
что именно, не понятно?
|
16.01.2012, 16:10 | #3 |
Пользователь
Регистрация: 05.12.2010
Сообщений: 14
|
почему тут используются указатели? что они делают?
Код:
|
16.01.2012, 16:35 | #4 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Может быть у автора - шизофрения. Спроси у автора кода. Учи тему "указатели си/с++" Последний раз редактировалось _Bers; 16.01.2012 в 16:39. |
|
17.01.2012, 11:07 | #5 | |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
Цитата:
Указатели хранят адреса других переменных. P.S. Советую почитать об указателях в какой-нибудь умной книжке. Например, в книге Кернигана и Ритчи "Язык программирования Си" (глава 5. Указатели и массивы), написано просто и подробно. |
|
17.01.2012, 11:38 | #6 |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
Функция не может возвращать больше одного значения.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
17.01.2012, 11:47 | #7 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
|
17.01.2012, 13:06 | #8 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
8Observer8, специально для вас я включил телепатию, и постараюсь вам объяснить наглядно.
Рассмотрим выше представленный код: Код:
Теперь, видимо, они дошли до ссылок, и получили новое задание - сделать все тоже самое, только с использованием ссылок. Но поскольку автор темы не знает ни ссылок, ни указателей, то у него возник ступор. Указатели и ссылки в функциях используются по двум главным причинам: 1. Экономия на конструкторах копирования. 2. Возможность для функций приготовить несколько выходных значений. Это как бы понятно всем, кто хотя бы чуть чуть знаком с принципами работы указателей и ссылок. А теперь главный вопрос: На языке с++ когда идеологически предпочтительнее использовать ссылки, а когда указатели? Вот я заметил, люди перешедшие на с++ с чистого си, не всегда это осознают, и по старинке продолжают шлёпать указатели. Рассмотрим пример: Код:
Что данная функция допускает в качестве аргумента не_валидный указатель Код:
Код:
То есть ничайно ошибиться, и подать на вход черти-что уже не получится. Только реальные данные. Код:
Далее, в теле самой функции стоит ассерт на "нулевую ссылку". Обычно, этого бывает достаточно для безопасности. Ибо нечайно инициализировать ссылку нулевым объектом - в это ещё можно поверить. Но ничайно инициализировать ссылку, непойми чем, но чем то нереальным - это уже паранойя. Ну или откровенное вредительство. Проверка внутри функции может выглядеть вот так: Код:
Резюмируя: 1. В ситуациях, когда идеологически, функция должна уметь работать с не_валидными указателями - работают с указателями. При этом функция обязана проверить все входящие данные, и если пофиксит ноль - ну допустим, будет считать, что нужно юзать аргумент по умолчанию (например, такой подход используется в WINAPI). Причем, поскольку не_валидные указатели по замыслу могут быть в любой момент, то проверка входных данных должна войти и в релиз тоже. 2. В ситуациях, когда идеологически, функция должна работать только с реальными данными - работают с ссылками, превентивно защищая тем самым инвариант функций, и облегчая процесс проверки входных данных. /ps Поскольку во втором варианте проверок валидности входящих данных меньше, то второй вариант для релиз-версии работает быстрее. Последний раз редактировалось _Bers; 17.01.2012 в 17:05. |
17.01.2012, 16:52 | #9 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
Спасибо, _Bers. Я раньше думал, что ссылки на переменные стандартных типов - это лишь удобство ("синтаксический сахар").
Интересно, а функции наподобие ASSERT_ME стандартные или их самому надо писать? |
17.01.2012, 16:56 | #10 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
http://www.cplusplus.com/reference/c...assert/assert/ Но, лично я использую более удобную надстройку над стандартным ассертом. А так вообще, изготовить собственный ассерт не сложно. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Переменные, ссылки и указатели. Правильно ли я их понимаю? | over96 | Общие вопросы C/C++ | 4 | 11.01.2012 02:04 |
указатели vs ссылки | Aistn | Общие вопросы C/C++ | 9 | 01.06.2011 23:02 |
ссылки и указатели. | mojohead | Помощь студентам | 13 | 14.01.2011 16:00 |
Найти и исправить ошибку. (Ссылки, указатели, утечка памяти) С,С++ | ZanLeO | Общие вопросы C/C++ | 8 | 09.08.2010 13:00 |
C++ Указатели и ссылки - Вычислить площадь квадрата. | Scarletred | Помощь студентам | 2 | 24.05.2010 03:49 |