Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> физич. смысл указателей и ссылкок, в чем заключается физический смысл ссылк 
:(
    Опции темы
richi
Дата 17.12.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.12.2008

Репутация: нет
Всего: нет



в чем заключается физический смысл ссылки на объект?

О взаимоотношениях указателями и объекта понятно:
указатель хранит адрес объекта, на который он ссылается. Под указатель требуется 4 байта.
когда создается объект, под него выделяется память определенного размера и его адрес быть присвоен указателю.

читал, что ссылка - это разыменованный указатель, т.е. операция взятия адреса уже реализована в ссылке.
и указатель и ссылка содержат адрес объекта.

что происходит в памяти, когда создается ссылка? 
зачем тогда придумали ссылку, если есть указатель?
какие могут быть случаи, что нужно использовать именно ссылку , а не указатель?


PM MAIL   Вверх
Kallikanzarid
Дата 17.12.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Цитата(richi @  17.12.2008,  17:45 Найти цитируемый пост)
в чем заключается физический смысл ссылки на объект?

Матожидание квадрата модуля волновой функции ячейки памяти? 0_о
PM MAIL   Вверх
Rififi
Дата 17.12.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



richi
зачем тогда придумали ссылку, если есть указатель?
- лень звездочку приписывать
- obj.field получается короче чем obj->field 
:gigi:
PM MAIL   Вверх
mes
Дата 17.12.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(richi @  17.12.2008,  17:45 Найти цитируемый пост)
что происходит в памяти, когда создается ссылка? 
зачем тогда придумали ссылку, если есть указатель?
какие могут быть случаи, что нужно использовать именно ссылку , а не указатель?

Ссылка и указатель это разные способы доступа к переменной.
Указатель это переменная ссылка. Но не ссылка это разъименнованый указатель.
если в си не было понятия ссылка, это не значит что она не существовало как сущность.
Код

struct A { };
A a;      // переменная "хранит" адрес объекта и предоставляет доступ к нему по  А-типизированной ссылке.
A *pa;  // переменная "хранит" адрес объекта и предоставляет доступ к нему по  А-типизированному указателю.          






Это сообщение отредактировал(а) mes - 17.12.2008, 20:30


--------------------
PM MAIL WWW   Вверх
vinter
Дата 17.12.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



<больше не нужно>

Это сообщение отредактировал(а) vinter - 17.12.2008, 21:07


--------------------
Мой блог
PM MAIL WWW   Вверх
richi
Дата 17.12.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.12.2008

Репутация: нет
Всего: нет



Цитата(mes @ 17.12.2008,  19:21)
Ссылка и указатель это разные способы доступа к переменной.
Указатель это переменная ссылка. Но не ссылка это разъименнованый указатель.
если в си не было понятия ссылка, это не значит что она не существовало как сущность.
Код

struct A { };
A a;      // переменная "хранит" адрес объекта и предоставляет доступ к нему по  А-типизированной ссылке.
A *pa;  // переменная "хранит" адрес объекта и предоставляет доступ к нему по  А-типизированному указателю.          

будет ли корректным если скажу так:

Код

struct A { };
A a;        //участок памяти"хранит" адрес объекта, данные объекта 
             //и предоставляет доступ к нему по  А-типизированной ссылке.
A *pa;   // участок памяти "хранит" адрес объекта, системную инфу (типо что это указатель и тд) 
             //и предоставляет доступ к нему по  А-типизированному указателю.

//а как насчет ссылки?

A &a;     //участок памяти "хранит" адрес объекта, .., но не хранит данные (?)

PM MAIL   Вверх
Romikgy
Дата 17.12.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



Код

Ссылки
 Ссылку можно рассматривать как еще одно имя объекта.
 В основном ссылки используются для задания параметров и возвращаемых
 функциями значений , а также для перегрузки операций (см.$$7).
 Запись X& обозначает ссылку на X. Например:

       int i = 1;
       int& r = i;    // r и i  ссылаются на одно и то же целое
       int x = r;     // x = 1
       r = 2;         // i = 2;

Ссылка должна быть инициализирована, т.е.
должно быть нечто, что она может обозначать. Следует помнить, что
инициализация ссылки совершенно отличается от операции присваивания.
Хотя можно указывать операции над ссылкой, ни одна из них на саму ссылку
не действует, например,

      int ii = 0;
      int& rr = ii;
      rr++;        // ii увеличивается на 1

Здесь операция ++ допустима, но rr++ не увеличивает саму
ссылку rr; вместо этого ++ применяется к целому, т.е. к переменной ii.
Следовательно, после инициализации значение ссылки не может быть
изменено: она всегда указывает на тот объект, к которому была привязана
при ее инициализации. Чтобы получить указатель на объект,
обозначаемый ссылкой rr, можно написать &rr.
Очевидной реализацией ссылки может служить постоянный указатель,
который используется только для косвенного обращения. Тогда инициализация
ссылки будет тривиальной, если в качестве инициализатора указан адрес
(т.е. объект, адрес которого можно получить; см. $$R.3.7).
Инициализатор для типа T должен быть адресом. Однако, инициализатор
для &T может быть и не адресом, и даже не типом T. В таких случаях
делается следующее:
[1] во-первых,  если необходимо, применяется преобразование типа
    (см.$$R.8.4.3);
[2] затем получившееся значение помещается во временную переменную;
[3] наконец, адрес этой переменной используется в качестве инициализатора
    ссылки.
Пусть имеются описания:

      double& dr = 1;          // ошибка: нужен адрес
      const double& cdr = 1;   // нормально

 Это интерпретируется так:

      double* cdrp;    // ссылка, представленная как указатель
      double temp;
      temp = double(1);
      cdrp = &temp;

http://www.cyberguru.ru/programming/cpp/cp...up2-page17.html

я так понимаю ссылка просто еще одно обзывание какой либо переменой


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
mes
Дата 17.12.2008, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(richi @  17.12.2008,  22:34 Найти цитируемый пост)

будет ли корректным если скажу так:

нет. участок памяти не хранит ничего кроме значения.
Как будет трактоваться данный участок зависит от типа переменной (интерфейса), посредством которого был осуществлен доступ к данной памяти.



--------------------
PM MAIL WWW   Вверх
richi
Дата 17.12.2008, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.12.2008

Репутация: нет
Всего: нет



интуитивно конешно было понятно
но дошло после этого
Код

Очевидной реализацией ссылки может служить постоянный указатель,


спасибо за ссылку на "ссылку"! smile 
пойду дальше читать Страуструпа

Добавлено через 10 минут и 11 секунд
Цитата(mes @ 17.12.2008,  23:22)
Как будет трактоваться данный участок зависит от типа переменной (интерфейса), посредством которого был осуществлен доступ к данной памяти.

понятно

класс!


PM MAIL   Вверх
mes
Дата 17.12.2008, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Код

struct A {}
A a;                  // 1
A     a1   =a;    // 2
A&   a2   =a;   // 3
A*   pa   =&a; // 4
A*& pa1 =pa; // 5

1. Создается новый объект 1. 
2. Создается новый объект 2. по образу объекта 1. 
3. Переменная ассоциируется с адресом объекта 1.
4.  Создается объект-указатель 4. , инициализированный адресом объекта 1.
5. Переменная ассоциируется с адресом объекта 4.

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




--------------------
PM MAIL WWW   Вверх
J0ker
Дата 18.12.2008, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



рассматривайте ссылку как алиас и будет вам щасте  smile 


--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 18.12.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



есть процессор на котором работает программа, и для процессора есть несколько типов данных (отличаются размером и представлением) и несколько типов указателей. это "физический уровень"
остальное - абстракции ЯВУ
PM MAIL ICQ   Вверх
mes
Дата 19.12.2008, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(MAKCim @  19.12.2008,  01:33 Найти цитируемый пост)
, потому как не специфицирована и не определена в общем случае ее реализация

Ваш взгляд понятен, мы рассматриваем одно и то же явление в разных аспектах и потому взгляды отличаются.
Ссылку и указатель я рассматриваю как способ доступа к объекту (прямой/косвенный). Для меня они абстракции одного уровня
и то что у указателя можно узнать его расположение в памяти является всего лишь его отличительной особенностью от ссылки.





--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 19.12.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



UnrealMan, а что тогда не абстракция ЯП?
PM MAIL ICQ   Вверх
SABROG
Дата 19.12.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 1
Всего: 91



Вот кстати интересно насчет доступа к переменной посредством ссылки. Предположим есть переменная, компилятор все так соптимизировал, что переменная будет находится в одном из регистров eax,ebx и т.д. и т.п. Тут нам в голову пришла мысль использовать ссылку. Предположим мы захотели передать ее в функцию. Что будет делать компилятор, ведь у регистров нет адреса ? Скопирует значение в стек или память и возьмет адрес оттуда ? А если это функция чужой .dll о которой компилятор не знает и оптимизировать не может ?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1006 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.