Вопрос по ссылкам и указателям

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

б_д_в
Сообщения: 20
Зарегистрирован: 17 сен 2009, 12:11

Не подскажите литературу или статьи(ю) в инете просто и доходчиво объясняющую логику работы со ссылками и указателями. Как и где их лучше, правильнее применять. Суть этого «зверя» не уловлю…вроде бы улавливаю, т.е. рассказать могу. Но если не вижу, как и где их применить при написании проги, то значит, не понимаю.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Ссылка - это синоним, а указатель - это адрес памяти.
В процедурах, если значение параметра меняется, то лучше юзать указатель, т.к. сразу видно, что параметр внутри процы может измениться. А если параметр не может меняться, то лучше использовать константную ссылку.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
б_д_в
Сообщения: 20
Зарегистрирован: 17 сен 2009, 12:11

Airhand писал(а):Ссылка - это синоним,
Синоним чего?
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

б_д_в писал(а):Синоним чего?
Синоним самой переменной. С ней можно вытворять всё, что и с самой переменной.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Airhand, ты попадаешь в ловушку, в которую попадают многие. Причём виноват даже не ты, а современная литература, в 90% которой нет грамотного определения ссылки. Везде пишут "ссылка - это синоним", не давая дополнительных объяснений. И ты повторяешь прочитанное. Если ты не можешь дать корректного определения ссылки, значит ты не понимаешь её сути.

И указатель, и ссылка - это адреса (первый - явный, вторая - неявный). Самое главное отличие ссылки от указателя - это её константная сущность. Вследствии того, что ссылка является константным объектом (именно сама ссылка, а не память, на которую она указывает), то отсюда вытекает несколько известных и не очень известных особенностей ссылки. На самом деле, если отбросить чисто синтаксические отличия между указателем и ссылкой (там *, здесь &, там нужно разыменовывать, здесь не нужно), то указанные ниже особенности составляют полный перечень отличий.

1. Ссылка должна быть явно инициализирована (как и любая другая константная сущность).
2. Ссылка не может быть NULL (на самом деле это можно обойти, но далеко не все компиляторы понимают конструкцию ((T&)NULL), где T - произвольный тип).
3. Ссылку нельзя перенаправить на другой объект (так же, как и любую другу константную сущность).
4. К ссылке не применимы адресные операции (так как хранимый в ссылке адрес константен).
5. Константных ссылок не бывает, хотя бывают ссылки на константные данные (это тоже следствие, так как константная константность - получается тавтология).

Последний пункт немного распишу, чтобы было понятно о чём я говорю. Для поинтеров у нас доступны следующие варианты использования const.

Код: Выделить всё

char * p;
const char * p;
char * const p;
const char * const p;
Думаю, подкованному читателю не затруднит подписать напротив каждой строки, что обозначает каждая из этих записей. Так вот для ссылок последние два варианта следует отбросить, как невозможные. Таким образом из четырёх вариантов остаются только первых два:

Код: Выделить всё

char & p;
const char & p;
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Romeo писал(а):И указатель, и ссылка - это адреса (первый - явный, вторая - неявный).
Я знаю ЧТО такое ссылка по сути и я не давал, как тебе вздумалось, её определения. Я лишь сказал как будет проще это понять.
Ты себя считаешь самым умным: пишешь дескать в книгах неверно дали определение. Ты написал много книг ? Тогда почему ты имееш какие-то претензии к тем, кто написал ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Во-первых, ты сказал книжным определением. Во-вторых, такое определение вовсе не упрощает, а на оборот усложняет понимание. Оба этих факта указывают на то, что ты не понимаешь сути ссылки.

К книгам я имею массу претензий и все они обоснованы. У нас в стране писать стали все, даже бульварные писаки, порой, не разбираясь в азах, пытаются писать на такие темы, как С++ или другие тонкие материи. Такие книжки очень хороши в качестве туалетной бумаги, но неприемлемы, как учебные пособия.

Сколько я книг написал? Полностью ещё ни одной. Сейчас собираю материал. Ты своим незнанием, кстати, очень мне помогаешь в этом.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Romeo писал(а):Ты сказал книжным определением. И так вовсе не проще, так сложнее понять.
За определеним идут в библиотеку или за книгой/конспектом, но ни как не на форум. Мне тебя жаль: за определениями ты шаришся по форумам.
К книгам я имею массу претензий и все они обоснованы. У нас в стране писать стали все,
Даже ты в этом форуме. :D
С++ или другие тонкие материи
ОчччЧчень тонкая материя. :D
Сколько я книг написал? Полностью ещё ни одной.
Ни одной, а гонору у тубя столько, как будто написал уже десяток.

P.S. Я тебе уже какой раз повторяю: есть какие-то претензии ко мне - опиши их в личку. А то получается, что ты чувствуешь себя хоть кем-то, если это выставлено на всеобщее обозрение.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
б_д_в
Сообщения: 20
Зарегистрирован: 17 сен 2009, 12:11

Код: Выделить всё

char & p;
const char & p;
Romeo, в чем разница между первым и вторым вариантом? Насколько я понял ссылка постоянна...к чему модификатор const? Наверное, использование в программе ИМЕННО второго варианта крайняя редкость?
L.A.V.
Сообщения: 20
Зарегистрирован: 16 авг 2009, 23:37
Откуда: Солнечный Крым
Контактная информация:

б_д_в, такое ощущение, что ты так и не понял до конца в чем заключается константность ссылки как таковой. Хотя выше все прекрасно написано. Перечитай еще разок и попробуй понять следующие моменты.
Romeo писал(а): И указатель, и ссылка - это адреса (первый - явный, вторая - неявный). Самое главное отличие ссылки от указателя - это её константная сущность. Вследствии того, что ссылка является константным объектом (именно сама ссылка, а не память, на которую она указывает),

1. Ссылка должна быть явно инициализирована (как и любая другая константная сущность).
2. Ссылка не может быть NULL (на самом деле это можно обойти, но далеко не все компиляторы понимают конструкцию ((T&)NULL), где T - произвольный тип).
3. Ссылку нельзя перенаправить на другой объект (так же, как и любую другу константную сущность).
4. К ссылке не применимы адресные операции (так как хранимый в ссылке адрес константен).
5. Константных ссылок не бывает, хотя бывают ссылки на константные данные (это тоже следствие, так как константная константность - получается тавтология).
Вот примеры. Пробуй, экспериментируй и все поймешь.

Код: Выделить всё

char any = 'a';

char & ref_f = any;
const char & cref_f = any;
//обе ссылки хрянат в себе адрес переменной any, но	

ref_f = 'b';  // any теперь тоже равна 'b'
cref_f = 'c'; // нельзя изменить, так как cref_f - ссылка на константные данные.
	
//ну и еще вариант
const char  cany = 'A';
char & ref_s = cany;      // не верно, нельзя преобразовать константный объект в не константный
const char & ref = cany; // верно, ссылка на константные данные


Теперь немного оффтопа, прошу простить, не удержался. :)
Когда прочтиал пост #5. была мысль: "Блин, да этому парню надо книги писать. Настолько все четко, логично и понятно излагает."
После поста #7 лежал под столом :D , если это не шутка конечно, то я очень рад. :)
В общем, успехов в написании, Romeo.
Ответить