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

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

08.07.2017, 18:55. Показов 12543. Ответов 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
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 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
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 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
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 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
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru