Вопрос по ссылкам и указателям
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Не подскажите литературу или статьи(ю) в инете просто и доходчиво объясняющую логику работы со ссылками и указателями. Как и где их лучше, правильнее применять. Суть этого «зверя» не уловлю…вроде бы улавливаю, т.е. рассказать могу. Но если не вижу, как и где их применить при написании проги, то значит, не понимаю.
Ссылка - это синоним, а указатель - это адрес памяти.
В процедурах, если значение параметра меняется, то лучше юзать указатель, т.к. сразу видно, что параметр внутри процы может измениться. А если параметр не может меняться, то лучше использовать константную ссылку.
В процедурах, если значение параметра меняется, то лучше юзать указатель, т.к. сразу видно, что параметр внутри процы может измениться. А если параметр не может меняться, то лучше использовать константную ссылку.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
Синоним чего?Airhand писал(а):Ссылка - это синоним,
Синоним самой переменной. С ней можно вытворять всё, что и с самой переменной.б_д_в писал(а):Синоним чего?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Airhand, ты попадаешь в ловушку, в которую попадают многие. Причём виноват даже не ты, а современная литература, в 90% которой нет грамотного определения ссылки. Везде пишут "ссылка - это синоним", не давая дополнительных объяснений. И ты повторяешь прочитанное. Если ты не можешь дать корректного определения ссылки, значит ты не понимаешь её сути.
И указатель, и ссылка - это адреса (первый - явный, вторая - неявный). Самое главное отличие ссылки от указателя - это её константная сущность. Вследствии того, что ссылка является константным объектом (именно сама ссылка, а не память, на которую она указывает), то отсюда вытекает несколько известных и не очень известных особенностей ссылки. На самом деле, если отбросить чисто синтаксические отличия между указателем и ссылкой (там *, здесь &, там нужно разыменовывать, здесь не нужно), то указанные ниже особенности составляют полный перечень отличий.
1. Ссылка должна быть явно инициализирована (как и любая другая константная сущность).
2. Ссылка не может быть NULL (на самом деле это можно обойти, но далеко не все компиляторы понимают конструкцию ((T&)NULL), где T - произвольный тип).
3. Ссылку нельзя перенаправить на другой объект (так же, как и любую другу константную сущность).
4. К ссылке не применимы адресные операции (так как хранимый в ссылке адрес константен).
5. Константных ссылок не бывает, хотя бывают ссылки на константные данные (это тоже следствие, так как константная константность - получается тавтология).
Последний пункт немного распишу, чтобы было понятно о чём я говорю. Для поинтеров у нас доступны следующие варианты использования const.
Думаю, подкованному читателю не затруднит подписать напротив каждой строки, что обозначает каждая из этих записей. Так вот для ссылок последние два варианта следует отбросить, как невозможные. Таким образом из четырёх вариантов остаются только первых два:
И указатель, и ссылка - это адреса (первый - явный, вторая - неявный). Самое главное отличие ссылки от указателя - это её константная сущность. Вследствии того, что ссылка является константным объектом (именно сама ссылка, а не память, на которую она указывает), то отсюда вытекает несколько известных и не очень известных особенностей ссылки. На самом деле, если отбросить чисто синтаксические отличия между указателем и ссылкой (там *, здесь &, там нужно разыменовывать, здесь не нужно), то указанные ниже особенности составляют полный перечень отличий.
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Я знаю ЧТО такое ссылка по сути и я не давал, как тебе вздумалось, её определения. Я лишь сказал как будет проще это понять.Romeo писал(а):И указатель, и ссылка - это адреса (первый - явный, вторая - неявный).
Ты себя считаешь самым умным: пишешь дескать в книгах неверно дали определение. Ты написал много книг ? Тогда почему ты имееш какие-то претензии к тем, кто написал ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
За определеним идут в библиотеку или за книгой/конспектом, но ни как не на форум. Мне тебя жаль: за определениями ты шаришся по форумам.Romeo писал(а):Ты сказал книжным определением. И так вовсе не проще, так сложнее понять.
Даже ты в этом форуме.К книгам я имею массу претензий и все они обоснованы. У нас в стране писать стали все,

ОчччЧчень тонкая материя.С++ или другие тонкие материи

Ни одной, а гонору у тубя столько, как будто написал уже десяток.Сколько я книг написал? Полностью ещё ни одной.
P.S. Я тебе уже какой раз повторяю: есть какие-то претензии ко мне - опиши их в личку. А то получается, что ты чувствуешь себя хоть кем-то, если это выставлено на всеобщее обозрение.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
#define while if
Оптимизация по размеру:
#define struct union
Код: Выделить всё
char & p;
const char & p;
-
- Сообщения: 20
- Зарегистрирован: 16 авг 2009, 23:37
- Откуда: Солнечный Крым
- Контактная информация:
б_д_в, такое ощущение, что ты так и не понял до конца в чем заключается константность ссылки как таковой. Хотя выше все прекрасно написано. Перечитай еще разок и попробуй понять следующие моменты.
Теперь немного оффтопа, прошу простить, не удержался.
Когда прочтиал пост #5. была мысль: "Блин, да этому парню надо книги писать. Настолько все четко, логично и понятно излагает."
После поста #7 лежал под столом
, если это не шутка конечно, то я очень рад. 
В общем, успехов в написании, Romeo.
Вот примеры. Пробуй, экспериментируй и все поймешь.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 лежал под столом


В общем, успехов в написании, Romeo.