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

Указатели и ссылки: в чем разница

08.07.2017, 18:55. Показов 12359. Ответов 85
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, объясните, пожалуйста, в чем разница между "ссылается" и "указывает"?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.07.2017, 18:55
Ответы с готовыми решениями:

Ссылки vs указатели - в чем разница?
Навеяно соседней темой. Не понимаю в чем разница, хотя несколько раз честно пробовал почитать на эту тему, правда без должного внимания и...

Указатели и ссылки: в чём их разница и сходство?
Я начал учить с++ и не могу кое в чём разобраться. Кто знает ответы на эти вопросы может ответить или скинуть какую нибудь ссылку где это...

в чем разница? массивы и указатели строк
В примере Дейтла ( в документе ) массивы строк инициализируются через указатели, при этом компилятор выдает ошибки. Я же инициализоравал...

85
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 01:53
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от daun-autist Посмотреть сообщение
Это unevaluated context. declval тут не вызывается, и ссылка ни нулевая, ни ненулевая.
с точки зрения синтаксиса там создается ссылка.
тот факт, что компилятор не обязан вызывать функцию по факту - монопенисуальный фактор.

к тому же, можно убрать decltype,
если он вас так смущает.
будет вполне себе well-formed,
пока кто нибудь не попытается прочитать значение переданного аргумента.


Цитата Сообщение от daun-autist Посмотреть сообщение
Другие тут и не обсуждаются.
теперь - обсуждаются.

Цитата Сообщение от daun-autist Посмотреть сообщение
А мамкиным какирством типа memcpy поверх структуры со ссылкой можно удивить разве что одноклассников.
ваше мнение очень важно для нас.

Цитата Сообщение от Croessmah Посмотреть сообщение
* ссылку нельзя "переназначить", указатель - можно;
примечателен тот факт, что для элипсисов компилятор обязан
честным образом покласть аргументы на стек.
причем ссылка идет указателем.

отсюда интересный вопрос:
сможет ли кто нибудь привести реальный пример,
который бы проиллюстрировал UB в действии,
после перенацеливания ссылки элипсисом?


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

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
При желании можно - засунуть в структуру и placement new ее. Хотя да, это уже из серии сравнительно честного обмана системы типов.
вполне законный, годный способ.
0
Заблокирован
10.07.2017, 01:57
Цитата Сообщение от hoggy Посмотреть сообщение
к тому же, можно убрать decltype,
если он вас так смущает.
будет вполне себе well-formed,
Вот ты и попался.
Цитата Сообщение от http://en.cppreference.com/w/cpp/utility/declval
Note that because no definition exists for declval, it can only be used in unevaluated contexts; it is an error to evaluate an expression that contains this function. Formally, the program is ill-formed if this function is odr-used.
Цитата Сообщение от hoggy Посмотреть сообщение
пока кто нибудь не попытается прочитать значение переданного аргумента.
У declval вообще аргументов нет.


Ты про любую функцию без аргументов, возвращающую ссылку, думаешь, что она возвращает нулевую ссылку?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
10.07.2017, 02:04
hoggy, declval возвращает какую-то ссылку, а не нулевую.
Используется в контексте вывода типа.

Для вычисляемогг контекста это как:
C++
1
2
3
4
5
6
int &foo();
 
int main()
{
   foo();//нулевая ссылка чтоли?
}
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 02:16
Цитата Сообщение от daun-autist Посмотреть сообщение
Вот ты и попался.
сделайте себе её аналог.
повыпиливав всякие static_assert на использование.
и все сразу станет well-formed

Цитата Сообщение от hoggy Посмотреть сообщение
пока кто нибудь не попытается прочитать значение переданного аргумента.
Цитата Сообщение от daun-autist Посмотреть сообщение
Ты про любую функцию без аргументов, возвращающую ссылку, думаешь, что она возвращает нулевую ссылку?
я про любую функцию, которая получает инвалидную ссылку,
но не пытается её читать.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
10.07.2017, 02:20
hoggy, предлагаю другой способ переназначения ссылки.
Берем один файл и делаем там пустую структуру и функцию main, выводящую размер этой структуры.
Собираем, запускаем, смотрим - размер 1 байт.
Далее берем другой файл, делаем структуру с одной ссылкой.
Функцию main оставляем такой же.
Собираем. Затем, подменяем собранный нами бинарник тем,
который собирали до этого, запускаем - размер структуры - 1 байт.
Вывод? Ссылка не занимает места, переназначить её нельзя. PROFIT.
Вот как-то так эти способы Ваши выглядят.

Добавлено через 3 минуты
сделайте себе её аналог.
Вот аналог:
C++
1
template<class T> add_rvalue_reference_t<T> declval() noexcept;
используйте её в вычисляемом контексте.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 02:24
Цитата Сообщение от Croessmah Посмотреть сообщение
declval возвращает какую-то ссылку, а не нулевую.
она вообще может быть макетом (прототипом без туловища)
и нужна что бы в компалтайме поиметь объект якобы построенный с аргументами,
забив на конструкторы этих самых аргументов, например.

C++
1
2
3
4
5
// даст true, если можно легально вызвать u.foo( a{} );
template<class u, class a> 
static std::true_type check(  
    decltype(  std::declval<u>().foo( std::declval<a>()  )  )*  
);
как бе она не предназначена для создания реальных объектов в рантайме.

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот как-то так эти способы Ваши выглядят.
способ с элипсисом выглядит как функция,
которая принимает на вход ссылку и адрес нового объекта.
а на выходе имеем ссылку, перенацеленную на новый объект.
без всяких там подмен бинарников непонятно зачем.
способ не зависит от оптимизаций

(хотя наверное может бомбануть на однофайловом проекте.
нужно тестить)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
10.07.2017, 02:27
hoggy, мы прекрасно знаем чем она может быть.
Использование её в вычисляемом контексте делает программу ill-formed.
Её аналог я привел - получите ошибку при использовании в вычисляемом контексте.
Если бы её можно было использовать в вычисляемом контексте,
то там бы был return, в котором мы должны были бы вернуть ссылку на какой-то объект.
Создать null reference в well-formed программе нельзя по причине того,
что для этого придется разыменовать нулевой указатель,
о чем прямым текстом написано в стандарте.

Добавлено через 56 секунд
hoggy, обсуждать способы с UB - бессмысленно.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 02:28
Цитата Сообщение от Croessmah Посмотреть сообщение
используйте её в вычисляемом контексте.
я использовал на практике что то вроде:

C++
1
T& nullref() { return *static_cast<T*>(nullptr); }
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
10.07.2017, 02:45
Обсуждать способы с UB - бессмысленно. Зачем Вы пишите эту ахинею?

Добавлено через 1 минуту
hoggy, у Вас на практике получилась не well-defined программа, содержащая UB.
Не вижу смысла её обсуждать. Ну ишпользовал и ишпользовал.
Некоторые union используют для интерпретации памяти.
Работает же, хоть и UB.

Добавлено через 15 минут
https://stackoverflow.com/ques... e-possible
0
Заблокирован
10.07.2017, 06:16

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
использовал на практике
Практика была после первого курса ПТУ?



Цитата Сообщение от hoggy Посмотреть сообщение
что то вроде:
C++
1
T& nullref() { return *static_cast<T*>(nullptr); }
Вызов этого компилируется в ud2 (но это не обязательно)

Добавлено через 1 час 18 минут
Ну может не просто вызов, а попытка использовать результат вызова.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 11:45
Цитата Сообщение от Croessmah Посмотреть сообщение
Обсуждать способы с UB - бессмысленно. Зачем Вы пишите эту ахинею?
"ахинея" - нечто нелогичное по определению самого понятия "ахинея".
но если так - тогда "ахинея" это то,
что в данный момент постулирует стандарт с++.

и что касается UB - все далеко не так однозначно.

в стандарте есть один весьма скользкий момент.
который стоит того,
что бы рассмотреть его более пристально.
и тогда то, что вы называете UB внезапно окажется не UB

рассмотрим простейший пример:

C++
1
2
3
4
5
6
7
8
9
//case 1
 
void foo(int){}
 
int main()
{
    int* p = nullptr;
    foo(10); // <--- OK
}
вопрос: содержит ли код UB?
очевидно, что нет.
нулевой указатель вообще не имеет
никакого отношения к вызову функции.

идем дальше:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//case 1
 
struct some
{
    static void foo(int){}
};
 
 
int main()
{
    some::* p = nullptr;
    some::foo(10); // <--- OK
}
а теперь? очевидно, что тоже нет.
статическая функция член вообще
ничем не отличается от обычной сишной,
просто объявлена она в простанстве имени класса.
указатель на объект класса ей не нужен,
и никак не используется.
компилятор сгенерирует код вызова так,
словно это самая обычная сишная функция
из первого кейса

вот теперь мы начиначаем подходить
к более интересным моментам:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//case 3
 
struct some
{
    static void foo(int){}
};
 
 
int main()
{
    some::* p = nullptr;
    p->foo(10); // <--- OK
}
содержит ли код UB?
здравый смысл подсказывает:
код по сути вообще ничем не отличается от второго кейса.
более того, здесь так же, как и для второго кейса,
компилятор будет вынужден сгенерировать код
вызова обычной функции-член,
которая так же, как и во втором кейсе
не будет содержать никаких
зависимостей от указателя.
по другому и быть не может.
статическая функция член должна быть вызвана.
и указатель для этого не нужен.

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

однако! стандарт говорит:
доступ по указателю через стрелочку эквивалентен
доступу по ссылке:

C++
1
(*p).foo(10);
тобишь, мы имеем дело с фактом разыменовывания нулевого указателя.

теперь внимание вопрос:
что именно подразумеват стандарт под "разыменовыванием указателя"?
доступ к данным через ссылку?
или сам факт построения безымянной ссылки на основе указателя?

ВАЖНО:
если первое - это разумно и логично,
но тогда третий кейс так же,
как и два первых не содержит никаких UB
и сама по себе операция разыменовывания:
*p UB не является.

если второе - то мы имеем дело с фактом наличия UB,
невзирая на unevaluated context

в действительности:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    int*p = nullptr;
    using t = decltype(*p); // (1) unevaluated context
 
    *p;   // (2) unevaluated context
 
    // так же как и в первом случае, 
    // результат выражения есть ссылка.
    // но никто ничего не пишет, и не читает
    // так же, как и в (1)
    // никаких "рантайм действий" не происходит
}
и вот мы на финишной прямой:
пришло время определяться:

что есть UB - попытка чтитать/писать нулевую ссылку
или сам факт наличия синтаксической записи - разыменовывание нулевого указателя?

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

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

резюмируя:
строго говоря, стандарт никогда не отличался
особой точностью своих формулировок.
взять те же самые "точки следования"
которые благодаря туманным формулировкам
породили бурление говен хвостатые холивары
не только в среде программистов-пользователей,
но и среди самих комитетчиков.
что в итоге привело к дополнительным правкам начиная с с++11

я считаю, что ситуация с разыменовыванием
нулевого указателя - аналогичная.
комитет опять налажал очередная жертва не точной,
двусмысленной форумулировки.
0
10.07.2017, 13:02

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
some::* p = nullptr;
Я думаю, ты имел ввиду some* p = nullptr;.

Я знаю, что ты вряд ли станешь на это сообщение как-то реагировать, но ты явно намудрил)
Цитата Сообщение от hoggy Посмотреть сообщение
*p UB не является.
Является-является, просто компилятор это проигнорирует.

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 13:14
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Является-является,
чем принципиально
Цитата Сообщение от Captain Maxee Посмотреть сообщение
*p
отличается от:
Цитата Сообщение от hoggy Посмотреть сообщение
decltype(*p)
?

согласно правилам языка - ничем.

своим "является-является"
вы только что вступили в противоречие стандарту по некоторым пунктам,
со здравым смыслом,
и реальной практикой.
0
Заблокирован
10.07.2017, 18:31
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Является-является,
http://www.open-std.org/jtc1/s... .html#1102

Цитата Сообщение от hoggy Посмотреть сообщение
*p UB не является.
Верно.
Цитата Сообщение от hoggy Посмотреть сообщение
*p; * // (2) unevaluated context
Неверно.

Цитата Сообщение от hoggy Посмотреть сообщение
согласно правилам языка - ничем.
Просто ты их не знаешь.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 18:58
Цитата Сообщение от daun-autist Посмотреть сообщение
Просто ты их не знаешь.
вам стоит подучить раздел "ссылки".
что это такое, и с чем их едят.
тогда может быть до вас допрет, почему без чтения/записи
ссылка - не более чем синтаксический мусор в исходнике.
и не является вычисляемым выражением.
0
Заблокирован
10.07.2017, 19:05
hoggy, является context unevaluated или нет определяется не тем, имеет ли выражение эффекты. Лол.

Добавлено через 2 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
она вообще может быть макетом
Ты смог наконец перевести то, что я написал в #42? (Note that because no definition exists for declval, it can only be used in unevaluated contexts;)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 19:21
Цитата Сообщение от daun-autist Посмотреть сообщение
является context unevaluated или нет определяется не тем, имеет ли выражение эффекты. Лол.
лолкают не от великого ума, однако.

вам по прежнему стоит подучить раздел "ссылки".
а заодно определиться с понятиями unevaluated/evaluate контексты.
дабы не лажать по поводу #54

Цитата Сообщение от daun-autist Посмотреть сообщение
Ты смог наконец перевести то, что я написал в #42?
см #44
0
Заблокирован
10.07.2017, 19:31
Цитата Сообщение от hoggy Посмотреть сообщение
лолкают не от великого ума, однако.
Нет аргументов — начни вешать ярлыки.

Цитата Сообщение от hoggy Посмотреть сообщение
а заодно определиться с понятиями unevaluated/evaluate контексты.
У меня нет с этим проблем. )

Цитата Сообщение от hoggy Посмотреть сообщение
дабы не лажать по поводу #54
Что именно там лажа?

Цитата Сообщение от hoggy Посмотреть сообщение
см #44
Что я там должен "см"? Определил я свой аналог, дальше что?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 19:47
Цитата Сообщение от daun-autist Посмотреть сообщение
Нет аргументов — начни вешать ярлыки
именно это и я имел ввиду:
отсутствие аргументации.
(см #54)

Цитата Сообщение от daun-autist Посмотреть сообщение
Что именно там лажа?
вот с этим:
Цитата Сообщение от daun-autist Посмотреть сообщение
У меня нет с этим проблем.
у вас есть с этим проблема.

я могу вам помочь решить эту проблему,
если хотите.
для этого вам нужно своими собственными словами
рассказать, как именно вы понимаете понятия
unevaluated/evaluate контексты,
и в чем между ними различия.

затем мы примерим это платье на понятие ссылки.
и вуаля.

Цитата Сообщение от daun-autist Посмотреть сообщение
Что я там должен
не помню, что бы вы давали расписку,
или приносили клятвы.

Цитата Сообщение от daun-autist Посмотреть сообщение
Определил я свой аналог, дальше что?
внимательно читайте след. сообщения.
0
Заблокирован
10.07.2017, 19:53
Цитата Сообщение от hoggy Посмотреть сообщение
для этого вам нужно своими собственными словами
рассказать, как именно вы понимаете понятия
unevaluated/evaluate контексты
"Свои слова" не нужны, стандарт определяет, что это такое.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.07.2017, 19:53

Ссылки и указатели - в чем преимущество одного над другим
Известно, что главной причиной появления ссылок в С++ было дать более безопасную альтернативу указателям в некоторых ситуациях. Ссылка в...

Указатели и ссылки c++
Здравствуйте! Не могли бы вы объяснить как можно использовать ссылки и указатели c++ на практике? Я не пойму для чего они нужны!

Ссылки и указатели
#include &lt;iostream&gt; using namespace std; int main() { int *n=new int{1,2}; cout&lt;&lt;&amp;n&lt;&lt;' '&lt;&lt;&amp;n&lt;&lt;' '&lt;&lt;&amp;n&lt;&lt;endl; return...

Указатели и ссылки
Добрый день, есть вопросы по поводу указателей и ссылок в параметрах функций. Правильно ли я понимаю, что есть по сути 2 варианта, либо...

Ссылки и указатели
Добрый день, не могу понять чем помогают при использовании указатели и ссылки? Есть код на c++ #progma once class well { ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
25 модель здравосохранения и функциональных требований к пищеблоку: конфликты функциональных требований.
anaschu 22.06.2026
Есть ли данные о том, какие функциональные/ эксплуатационные требования или их сочетания труднее всего учитывать при проектировании зданий? Да, такие данные есть, и они хорошо описаны и в российской,. . .
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энергоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерированы
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru