Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77

Использование ссылок и обычных имен переменных

08.07.2017, 23:26. Показов 5987. Ответов 82
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, у меня такой вопрос. Может быть он покажется довольно неинтересным вам, но мне просто надо понять кое-что.
Ссылка - это дополнительное имя для объекта. Имя объекта ссылается на его адрес.

Я правильно понимаю, что когда мы обращаемся к имени ссылки сначала мы получаем ее адрес, на который ссылается
ссылка (содержащийся в оригинальном имени переменной), а далее значение? А имя переменной также ссылается на некую область памяти, только вот при обращении к ней, мы сразу получаем конкретно значение?

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.07.2017, 23:26
Ответы с готовыми решениями:

Использование имен предопределенных объектов в качестве имен переменных
Есть код: #include <iostream> using namespace std; void func() { int cout; cout <<cout <<endl; }

Использование переменных вместо имен таблицы и полей в SQL-запросах
что-то у меня ругается на подобную запись, пишет: 'неправильный синтаксис около конструкции "KLIENTS"' где-то я не так пишу: ...

Использование длинных имен переменных увеличивает вес файла с программой?
Использование длинных имен переменных увеличивает вес файла с программой?

82
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.07.2017, 03:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от FishZone Посмотреть сообщение
рошу прощения, но вы имеете ввиду что под int & _reference = value; скрывается та инструкция о которой вы написали?)
И "под капотом" это значит с точки зрения реализации? А то первый раз слышу такой термин
Именно. С точки зрения реализации ссылка это такой указатель, который просто всегда автоматически разыменовывается. Технически стандарт не обязывает реализовывать ссылку именно так, но как ее реализовать иначе - науке неизвестно. Ну, то есть известно, но это уже называется не "реализация", а "оптимизация".
Цитата Сообщение от FishZone Посмотреть сообщение
Разрешает программисту явно не говорить компилятору на что ссылка("скрытый указатель") будет указывать, так? =)
Разрешает делать реализацию ничего и нигде не хранящую - "It is unspecified whether or not a reference requires storage".
Другой вопрос что никакой практической ценности это разрешение не несет. Компилятору и так никто не запрещает сделать оптимизацию выкидывающую любую локальную переменную, а то и весь код с ней работающий. Если же ссылка является не статическим полем структуры, то такая оптимизация попросту невозможна, ввиду того что значение полей на стадии компиляции неизвестно (было бы известно, их бы static сделали).
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2017, 03:45
Renji, ссылки - отдельный языковой механизм со своими правилами и возможностями,
делать из них простой "авторазыменовывающийся указатель" глупо.
И для компилятора оно тоже не так. Компилятор знает о ссылках и о их возможностях.
В конце концов оно если и превращается в указатель, то не в C++ коде и код тот
к c++ не имеет уже никакого отношения.
3
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.07.2017, 04:27
Цитата Сообщение от Croessmah Посмотреть сообщение
Renji, ссылки - отдельный языковой механизм со своими правилами и возможностями,
делать из них простой "авторазыменовывающийся указатель" глупо.
Ну ок, обертка над указателем.
Цитата Сообщение от Croessmah Посмотреть сообщение
В конце концов оно если и превращается в указатель, то не в C++ коде и код тот
к c++ не имеет уже никакого отношения.
Ага, ага. Конечно, в C++ сделано 100500 механизмов для тюнинга итогового машинного кода (inline, настройки выравнивания, расширения с restrict, ручное управление выделением памяти). Но во что там исходный код превращается, к C++ никакого отношения не имеет.
Впрочем, в большинстве случаев детали низкоуровневой реализации ссылок действительно не критичны.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.07.2017, 06:56
Цитата Сообщение от Renji Посмотреть сообщение
Ну ок, обертка над указателем.
не ок. не обёртка.
ссылка - есть результат разыменовывания указателя.
отсюда - колоссальное количество мест,
где фигурируют ссылки,
которые гарантированно не приводят к косвенному обращению к объектам.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
18.07.2017, 07:48
Цитата Сообщение от TRam_ Посмотреть сообщение
сконструированная копирующим конструктором
у стандартных типов нет никаких конструкторов в принципе.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.07.2017, 08:29
Цитата Сообщение от GbaLog- Посмотреть сообщение
у стандартных типов нет никаких конструкторов в принципе.
в принципе это не принципиально.
потому что:

1.
есть синтаксический сахарок,
который полностью их имитирует.

2.
есть наблюдаемое и ожидаемое поведение,
связанное с инициализацией.

C++
1
2
3
int v1; //<--- ничего не делающий дефолтный
int v2 = int(); // <--- дефолтный, инициализирующий нулем
int v3{}; // <--- дефолтный, инициализирующий нулем
что там "на самом деле" - не суть важно.
выглядит как утка. крякает как утка. плавает как утка.

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

главное не налажать:
C++
1
2
3
T v1;
T v2 = T();
assert(v1 == v2); //<--- upppsss
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
18.07.2017, 08:38
Цитата Сообщение от hoggy Посмотреть сообщение
в принципе это не принципиально.
ну дайте поумничать-то.
понятно, что у них есть всё для имитации конструкторов и даже деструкторов.
но их надо отличать, я считаю. )
а т.к. там явно указан тип int, то термин "копирующий конструктор" там не подходит, скорее просто "копирование".
Цитата Сообщение от hoggy Посмотреть сообщение
assert(v1 == v2); //<--- upppsss
UB же. в случае со встроенными типами.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.07.2017, 08:55
Цитата Сообщение от GbaLog- Посмотреть сообщение
но их надо отличать, я считаю.
не надо.
шаблоне итак доставляет.
если ещё начать пасти что тут у нас фундаментальное,
и чем оно различается,
да нафиг нужно.

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

Цитата Сообщение от GbaLog- Посмотреть сообщение
UB же. в случае со встроенными типами.
ога. и поэтому, моральный программист понимает:
лучше воспринимать дефолтный конструктор,
как unspecified behavior,
дабы не делать предположений, которые делать не нужно.
и сразу проще станет жизнь.
0
Заблокирован
18.07.2017, 13:23
Цитата Сообщение от hoggy Посмотреть сообщение
закон един для всех.
Нет, GbaLog- прав. У встроенных типов конструкторов нет в принципе. По закону. И инициализация встроенных и не-встроенных типов описывается принципиально по-разному.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
18.07.2017, 15:35
Цитата Сообщение от Croessmah Посмотреть сообщение
ссылки - отдельный языковой механизм со своими правилами и возможностями,
делать из них простой "авторазыменовывающийся указатель" глупо.
В книжке "Язык программирования С++", BINOM, Москва, 2002 в главе 5.5 Ссылки стр.137 на следующей от её начала странице (138) есть фраза:
Цитата Сообщение от да не хотел я... - как-то само получилось... но ведь работает же? A?
Очевидной реализацией ссылки является (константный) указатель, при каждом использовании которого происходит разыменование. Большого вреда в такой интерпретации ссылки нет, но при этом надо помнить, что ссылка в отличие от указателя не является объектом, над которым можно выполнять операции.
И это не глупость. Это пример того, что разговоры о неточных понятиях не могут быть точны в принципе. Тут я имею ввиду вот что. Можно без конца смотреть на огонь, на юных девушек говорящих о "любви и дружбе" и на программистов спорящих о "указателях и ссылках". Если цепляться к каждому слову, разговор получается долгим бесконечным. Можно рассказать о себе, знакомых... знакомых их знакомых, выплеснуть всю тоску и боль от неудачной обуви и пр.
Автор языка говорит буквально:
<< (константный) указатель, при каждом использовании которого происходит разыменование>>
а потом сурово предупреждает:
<< надо помнить, что ссылка в отличие от указателя не является объектом, над которым можно выполнять операции>>
Думаете он не понимает, что если указатель при каждом использовании разыменовать, то доступа к такому указателю нет и уже именно поэтому ни о каких операциях над ним не может быть и речи? То есть: - Вы только подкрадётесь (он - ссылко-указатель сидит тихо, будто вас и не видит), и как только кинетесь на него чтобы использовать, а он р-р-р-аз и разименовался. У вас в руках объект.
Он (автор языка) понимает, что такой указатель не дастся никогда и никому как указатель и уже поэтому нельзя применить к нему никакие операции (как к ссылко-указателю). Только к объекту можно. Но выразить такое поведение словами он не в силах.
Держу пари, что если бы он рискнул засветиться под нейтральным ником в подобном обсуждении, с подобными высказываниями, то мало бы ему не показалось. В общем этот предмет достаточно сложно выразить словами как таковой. (imho)
0
Заблокирован
18.07.2017, 17:11
IGPIGP, наивно полагать, что выступающие против сравнения ссылок с указателями не в курсе, как ссылки реально реализуются. Пекутся исключительно о том, чтобы у новичков не возникало каши в голове.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2017, 21:01
Цитата Сообщение от IGPIGP Посмотреть сообщение
Очевидной реализацией ссылки является
Очевидной реализацией автоматической переменной является смещение в кадре стека.
Но что-то я не вижу ни у кого стремления рассматривать переменную с такого ракурса.
Так почему же ссылки нужно рассматривать через более низкую реализацию,
или объяснять ссылки с помощью другой сущности?
Когда говорят, что ссылка - это "указатель, при каждом использовании которого происходит разыменование",
то просто стараются объяснить что-то новое на основании какой-то знакомой сущности.
А стоит ли так делать, особенно если учитывать, что такое объяснение
отстраняет нас от изучаемого языка и уносит в другую сторону?
Прежде чем ссылка станет "разыменовынным указателем" (если станет),
будет проверена правильность и семантика использования ссылки,
и ни о каких указателях речи вообще не идет.
Это именно отдельный механизм, и рассматривать его нужно как отдельный механизм.

Не по теме:

Порой кажется, что это всё заговор C'шников. :D


Если уж на то пошло, то почему бы не объяснить классы с помощью теории струн?
Ведь все знают, что не существует никаких указателей.
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.07.2017, 22:10
Цитата Сообщение от Croessmah Посмотреть сообщение
Очевидной реализацией автоматической переменной является смещение в кадре стека.
Но что-то я не вижу ни у кого стремления рассматривать переменную с такого ракурса.
Рассмотрим и с такого ракурса, когда эта самая переменная приведет к переполнению стека. Тоже ведь бывает народ удивляется "а почему я не могу создать локальный массивчик мегабайт на десять?".
Цитата Сообщение от Croessmah Посмотреть сообщение
Так почему же ссылки нужно рассматривать через более низкую реализацию,
или объяснять ссылки с помощью другой сущности?
Например, потому что указатели имеют проблемы с оптимизацией, решаемые ключевым словом restrict... которого в стандарт плюсов так и не завезли. И если ссылки собраны на указателях, понятное дело они тянут за собой и все проблемы этими указателями создаваемые.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
18.07.2017, 22:38
Цитата Сообщение от Croessmah Посмотреть сообщение
Так почему же ссылки нужно рассматривать через более низкую реализацию,
или объяснять ссылки с помощью другой сущности?
Я процитировал Б. С. именно для того, чтобы показать, что он считает это уместным. И именно потому, что ты мне не поверишь, если я скажу, что весь контракт (поведенческая сущность) раскрывается примером такой, - очевидной, реализации. Ни о каком механизме речи нет и я не считаю, что слово механизм как-то тут к месту, если сравнивать с понятием контракта.
Я думаю, со словом "глупость" ты погорячился, но признавать не хочется.
Вот утверждать то, что авторазыменовывающийся указатель вдобавок не доступен как указатель, это таки свойство математика (гуманитария). Хотя метру простительно, конечно.

Добавлено через 10 минут
Цитата Сообщение от daun-autist Посмотреть сообщение
IGPIGP, наивно полагать, что выступающие против сравнения ссылок с указателями не в курсе, как ссылки реально реализуются.
Наивно полагать, что слово "глупость" адресуется автору языка не по непониманию. Конечно понимают.
Цитата Сообщение от daun-autist Посмотреть сообщение
наивно полагать,
это оценка того кто
Цитата Сообщение от daun-autist Посмотреть сообщение
наивно полагает
я полагаю. Так же как и
Цитата Сообщение от Croessmah Посмотреть сообщение
делать из них простой "авторазыменовывающийся указатель" глупо
оценка тех кто из сложного механизма делает "просто указатель". Наверное каша в голове "у новичков" образуется проще от простых вещей и сложнее от сложных "механизмов". Тут те кто болеют о благе новичков в одном окопе с автором языка, как не парадоксально. Он тоже хотел "защитить и обезопасить". Других оправданий нет.
Я гуманитарий в меньшей степени чем технарь и буду с этим спорить. Иначе ни как.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.07.2017, 09:55
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я процитировал Б. С.
А дальше кто читать будет? Там же чуть дальше написано:
Как ссылка, так и указатель основаны на адресации памяти, но представляют программисту разные возможности.
И вот как раз с этим никто не спорит.

Ссылка как указатель, который автоматически разыменовывается: адрес <- указатель <- ссылка.
Ссылка как отдельный механизм, основанный на адресации памяти: указатель -> адрес <- ссылка.


Ну и зайдем прямо к нему на сайт и смотрим:
reference - an alternative name for an object or a function. See also: operator overloading, call-by-reference. TC++PL 5.4.1, D&E 3.7.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.07.2017, 11:54
Цитата Сообщение от Croessmah Посмотреть сообщение
А дальше кто читать будет?
Саша это ты о чём? О том что:
Цитата Сообщение от Croessmah Посмотреть сообщение
делать из них простой "авторазыменовывающийся указатель" глупо
звучит не разумно? Или ты уверен, что кто-то "не читал дальше".
Что касается разных возможностей, то нет таких возможностей предоставляемых ссылкой, которые не предоставлял бы указатель. Но не наоборот. Я думаю речь об этом. Хотя это не касается "глупости" от Б.С. как таковой.
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну и зайдем прямо к нему на сайт и смотрим:
Альтернативное имя. А кто из тех кто утверждал о поведении ссылки "как константного ука..." спорил с этим? Я не понимаю, цели обсуждения. Если речь о том у кого имхо больше, то я пас.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.07.2017, 12:19
Цитата Сообщение от IGPIGP Посмотреть сообщение
Что касается разных возможностей, то нет таких возможностей предоставляемых ссылкой, которые не предоставлял бы указатель.
Банально:
C++
1
2
3
4
5
6
7
int a = 10;
int b = 15;
const int & r = a + b;
//временный объект жив пока не умрет r.
//и им можно пользоваться.
std::cout << r << std::endl;//нет UB
//сделай тоже самое с указателем. Жду.
Ну и про rvalue-pointers писать вообще не будем, наверное. )))
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.07.2017, 13:09
Цитата Сообщение от Croessmah Посмотреть сообщение
Банально:
Я рад что ты ухватился за эту возможность. Слово "банально", это хотя бы не "глупо" и на том спасибо. ))

Добавлено через 4 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
сделай тоже самое с указателем. Жду.
Это мелковато. Опять хитровыдуманное правило, которое можно реализовать под капотом. А под капотом, можно и "Ку-ка-ре-ку!" реализовать.
C++
1
2
const char * ptr_to_const = "mama daragaya";
cout<< ptr_to_const;
0
19.07.2017, 13:25

Не по теме:

Кликните здесь для просмотра всего текста

Не по теме:

Croessmah, существуют ещё сектанты из секты "Массивов не существует, это просто сахар над указателями". Не знаю даже, кто хуже, они или участники секты "Ссылки это указатели".

0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
19.07.2017, 13:27
Цитата Сообщение от Croessmah Посмотреть сообщение
//сделай тоже самое с указателем. Жду.

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main()
{
    int a = 10;
    int b = 15;
    const int * p = reinterpret_cast<const int*>(a + b);
    std::cout << reinterpret_cast<size_t>(p);
}
правда, с отрицательными числами уже не прокатит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2017, 13:27

Удалить из имен обычных файлов (regular file) все цифры
Удалить из имен обычных файлов (regular file) все цифры.

Чем ссылки тега nav отличаются от обычных ссылок на странице?
Тега nav

Инициализация обычных статических переменных
Добрый вечер. Читаю небезызвестную философию джава. В одной из глав есть пример о порядке иницыализации статических и обычных полей. Код...

Отличие обычных переменных и глобальных
Здравствуйте, расскажите пожалуйста в чем отличие глобальных переменных об обычных объявляемых в процедуре?! Делал таймер, когда объявил...

Чтение имён переменных из файла и раскрытие этих переменных
Допустим есть скрипт &quot;1&quot;,в котором описано: set ueqrxbfmfi=t for /f &quot;usebackq tokens=*&quot; %%a in (&quot;test.txt&quot;) do set...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru