2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77

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

08.07.2017, 18:55. Показов 12403. Ответов 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, 20:04
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от daun-autist Посмотреть сообщение
"Свои слова" не нужны, стандарт определяет, что это такое.
ну-ну.
0
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77
10.07.2017, 22:58  [ТС]
Ого, всем спасибо за информацию. Еще изучать и изучать походу...
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.07.2017, 20:46
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Абсолютно никакой. Разве что, "указывает" применимо только к указателям, но я не уверен, что так правильно вообще выражаться.
Принято говорить, что указатель ptr ссылается на переменную var.
Неверно. Указатель (pointer) указывает (points to) на тип Т. В то время как ссылка (reference) ссылается (refers to) на переменную var.
Цитата Сообщение от Stanley Lippman
A reference defines an alternative name for an object. A reference type “refers to” another type.
A reference is not an object. Instead, a reference is just another name for an already existing object.
Цитата Сообщение от Stanley Lippman
A pointer is a compound type that “points to” another type. Like references, pointers
are used for indirect access to other objects. Unlike a reference, a pointer is an object
in its own right. Pointers can be assigned and copied; a single pointer can point to
several different objects over its lifetime. Unlike a reference, a pointer need not be
initialized at the time it is defined. Like other built-in types, pointers defined at block
scope have undefined value if they are not initialized.
Путаница с терминами из-за того, что к указателю применяют операцию "разыменования" (dereferencing).
0
Заблокирован
11.07.2017, 20:57
Цитата Сообщение от gru74ik Посмотреть сообщение
Путаница с терминами из-за того, что к указателю применяют операцию "разыменования" (dereferencing).
Это только считающие, что "указывает" и "ссылается" одинаково применимо к указателям, применяют операцию "разыменования" (dereferencing). Остальные применяют indirection.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.07.2017, 22:29
Цитата Сообщение от daun-autist Посмотреть сообщение
Это только считающие, что "указывает" и "ссылается" одинаково применимо к указателям, применяют операцию "разыменования" (dereferencing).
Не только:
Цитата Сообщение от Stanley Lippman
When a pointer points to an object, we can use the dereference operator (the *
operator) to access that object
Добавлено через 12 минут
daun-autist, да и в стандарте, несмотря на то, что предпочитается термин "indirection" используется и термин "dereferencing", причём в конце документа в именном указателе явно прописано, что это - синонимы.
Миниатюры
Указатели и ссылки: в чем разница  
0
Заблокирован
11.07.2017, 22:31
Цитата Сообщение от gru74ik Посмотреть сообщение
Stanley Lippman
Ну это его личные проблемы. http://eel.is/c++draft/expr.unary#def:indirection
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.07.2017, 22:35
daun-autist, стандарт считает, что это синонимы. По крайней мере, термин "dereferencing" неоднократно применяется в отношении "разыменования" итераторов: http://www.open-std.org/jtc1/s... /n4659.pdf
Вложения
Тип файла: pdf n4659.pdf (6.11 Мб, 5 просмотров)
0
Заблокирован
11.07.2017, 22:40
gru74ik, я думал возразить, но мне стало лень.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.07.2017, 22:44
Цитата Сообщение от daun-autist Посмотреть сообщение
gru74ik, я думал возразить, но мне стало лень.
Ну и правильно. Ни к чему. Тем более, что предпочтение термина "indirection" действительно помогает предотвратить путаницу.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.07.2017, 22:50
Цитата Сообщение от daun-autist Посмотреть сообщение
Ну это его личные проблемы.
он по крайней мере объясняет годно.

здесь же какая то хрень написана:

The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points. If the type of the expression is “pointer to T”, the type of the result is “T”.
результат разыменовывания указателя - ссылка вобще то. “T&”
0
Заблокирован
11.07.2017, 22:59
Цитата Сообщение от hoggy Посмотреть сообщение
здесь же какая то хрень написана
Ваше мнение очень важно для нас. Не кладите трубку.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.07.2017, 23:05
Цитата Сообщение от daun-autist Посмотреть сообщение
Ваше мнение очень важно для нас. Не кладите трубку.
это ваши личные проблемы.

продолжайте дальше пичкать себя с умным видом всякой хренью,
которая противоречит сама себе.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
11.07.2017, 23:13
daun-autist, у того же Страуструпа, тоже "dereferencing", кстати говоря:
Цитата Сообщение от Bjarne Stroustrup
The fundamental operation on a pointer is dereferencing, that is, referring to the object pointed to
by the pointer. This operation is also called indirection. The dereferencing operator is (prefix)
unary ∗ .
И тоже явно прописано, что "dereferencing" и "indirection" - это синонимы.
1
Заблокирован
11.07.2017, 23:38
Цитата Сообщение от hoggy Посмотреть сообщение
результат разыменовывания указателя - ссылка вобще то.
"Ссылка вообще-то" это возвращаемый тип встроенного оператора *.
А что касается результата выражения... возможно, это утверждение осталось с древних времён и его не исправили на ссылку. А может и нет. Ведь у нас есть такое http://eel.is/c++draft/expr#5

Цитата Сообщение от hoggy Посмотреть сообщение
которая противоречит сама себе.
http://eel.is/c++draft/expr#5

Добавлено через 1 минуту
gru74ik, на заборе тоже всякое пишут. Тут http://eel.is/c++draft/expr.unary#def:indirection это называется indirection. Нравится говорить dereferencing? Пока понятно о чём, говорите dereferencing сколько угодно.

Добавлено через 17 минут
hoggy, ты вот процитировал
The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points. If the type of the expression is “pointer to T”, the type of the result is “T”.
и выделил жирным последнее выражение. Хотя там ещё написано такое: "the result is an lvalue". Результат вызова функции (хоть встроенной) является lvalue, когда тип её возвращаемого значения является lvalue-ссылкой. Так что тут всё в порядке, просто
Цитата Сообщение от http://en.cppreference.com/w/cpp/language/value_category
Each C++ expression (an operator with its operands, a literal, a variable name, etc.) is characterized by two independent properties: a type and a value category. Each expression has some non-reference type
0
12.07.2017, 09:18

Не по теме:

Ждемс, когда DrOffset или TheCalligrapher вмешаются, что поставит точку в этих спорах :D

0
Заблокирован
13.07.2017, 03:12
Captain Maxee, а где тут споры? Называют ли обращение по указателю dereferencing? Называют, никто не спорит.

А то, что некоторые не понимают, что утверждения "выражение является lvalue с типом T" и "типом выражения является T&" эквивалентны и ищут здесь какие-то противоречия — это их проблемы.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2017, 04:09
Captain Maxee, некоторые не понимают разницы между lvalue T и lvalue T&
0
Заблокирован
13.07.2017, 04:20
Цитата Сообщение от hoggy Посмотреть сообщение
результат разыменовывания указателя - ссылка вобще то
Твоё "вообще то" на чём-то основано или это "я всегда так считал"?

Цитата Сообщение от hoggy Посмотреть сообщение
противоречит сама себе.
Пока тут было только одно место, где упоминался тип выражения с применением унарного оператора * к указателю. Одно утверждение не может противоречить самому себе. Так чему оно тогда противоречит?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.07.2017, 04:51
Цитата Сообщение от daun-autist Посмотреть сообщение
Твоё "вообще то" на чём-то основано
вообще - странный вопрос.
слегка попахивает бредом.

на здравом смысле,
и чутка рационализме основано моё "вообще то".
для этого не нужно быть семи пядей во лбу.
достаточно понимать, в чем особенность типов: T, T&, T*

а чем по вашему ещё может быть результат такого выражения?

если вы реально не понимаете,
можете просто убедиться в этом на практике:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    int* p;
    
    enum { is_reference = ::std::is_reference<decltype(*p)>::value };
    
    std::cout << "expression: *p is reference ? " 
        << (is_reference? "yes" : "no" ) 
        << '\n';
}
внезапно, результат предсказуемый на любых моральных компиляторах.

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

Цитата Сообщение от daun-autist Посмотреть сообщение
Так чему оно тогда противоречит?
тезис состоит из двух частей.

The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an
object type, or a pointer to a function type and the result is an lvalue referring to the object or function
to which the expression points. If the type of the expression is “pointer to T,” the type of the result is
“T.”
в первом утверждается, что результатом будет ссылка.

и тут же второе противоречит первому:
"если разыменовываем указатель на Т, результатом будет Т"

занавес.
0
Заблокирован
15.07.2017, 08:13
Цитата Сообщение от hoggy Посмотреть сообщение
на здравом смысле
Если что-то не соответствует здравому смыслу — значит, что здравый смысл обманывает. Примеров такому множество: (стандартная) теория относительности не соответствует здравому смыслу, квантовая механика (взять тот набивший всем оскомину эксперимент с электроном и двумя щелями) не соответствует здравому смыслу. Но при этом всё это работает.

Короче, здравый смысл не имеет приоритета перед спецификацией языка.

Цитата Сообщение от hoggy Посмотреть сообщение
можете просто убедиться в этом на практике
Ты применил std::is_reference к decltype(*p). А разговор шёл о типе выражения *p. Ты сделал то, что по-простому называется "подмена понятий".

Да, тип, обозначаемый decltype(*p) — это int&. А тип выражения *pint. И в этом нет противоречий! Заглянем в описание decltype:
Цитата Сообщение от http://eel.is/c++draft/dcl.type.simple#4
For an expression e, the type denoted by decltype(e) is defined as follows:

— if e is an unparenthesized id-expression naming a structured binding ([dcl.struct.bind]), decltype(e) is the referenced type as given in the specification of the structured binding declaration;

— otherwise, if e is an unparenthesized id-expression or an unparenthesized class member access, decltype(e) is the type of the entity named by e. If there is no such entity, or if e names a set of overloaded functions, the program is ill-formed;

— otherwise, if e is an xvalue, decltype(e) is T&&, where T is the type of e;

— otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;

— otherwise, decltype(e) is the type of e.

The operand of the decltype specifier is an unevaluated operand.
Итак, стандарт говорит нам, что *p это lvalue типа int. Значит для определения типа decltype(*p) нужно воспользоваться правилом, которое говорит про lvalue. Оно говорит, что для lvalue с типом T тип decltype будет T&. В нашем случае T = int, значит тип decltype(*p) — int&. Что мы и видим на практике. Противоречий не обнаружено.

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


Если тебе так хочется убедиться в чём-то на практике, изволь, я предоставлю тебе ещё возможность.
Посмотрим на то, как компиляторы смотрят на выражение *p. Попросим clang показать нам абстрактное синтаксическое дерево для следующего простого кода:
C++
1
2
3
4
5
int main()
{
    int* p;
    *p;
}
Он печатает (ссылка https://godbolt.org/g/LFyDyp ):
C++
1
2
3
4
5
6
7
8
TranslationUnitDecl
`-FunctionDecl <line:1:1, line:5:1> line:1:5 main 'int (void)'
  `-CompoundStmt <line:2:1, line:5:1>
    |-DeclStmt <line:3:5, col:11>
    | `-VarDecl <col:5, col:10> col:10 used p 'int *'
    `-UnaryOperator <line:4:5, col:6> 'int' lvalue prefix '*'
      `-ImplicitCastExpr <col:6> 'int *' <LValueToRValue>
        `-DeclRefExpr <col:6> 'int *' lvalue Var 0x64d0130 'p' 'int *'
Итак, что же он нам пишет про 4-ю строку, про унарный оператор *, применённый к p? Он пишет, что это... 'int' lvalue! А никак не 'int&' lvalue. Т.е. на практике мы опять не узрели противоречий.

Раз мы полезли в clang AST, заодно взглянем на decltype:
C++
1
2
3
4
5
int main()
{
    int* p;
    decltype(*p) decl = *p;
}
AST https://godbolt.org/g/VkGyCP :
C++
1
2
3
4
5
6
7
8
9
10
TranslationUnitDecl
`-FunctionDecl <line:1:1, line:5:1> line:1:5 main 'int (void)'
  `-CompoundStmt <line:2:1, line:5:1>
    |-DeclStmt <line:3:5, col:11>
    | `-VarDecl <col:5, col:10> col:10 used p 'int *'
    `-DeclStmt <line:4:5, col:27>
      `-VarDecl <col:5, col:26> col:18 decl 'decltype(*p)':'int &' cinit
        `-UnaryOperator <col:25, col:26> 'int' lvalue prefix '*'
          `-ImplicitCastExpr <col:26> 'int *' <LValueToRValue>
            `-DeclRefExpr <col:26> 'int *' lvalue Var 0x65935b0 'p' 'int *'
Итак, применение UnaryOperator* к p по-прежнему имеет тип int и категорию lvalue, а decltype(*p)'int &' . Никаких расхождений со стандартом. Ни в типе и категории *p, ни в описанном поведении decltype для типа и категории *p.

Слава комуугодно, у создателей clang с пониманием стандарта всё в порядке.



Цитата Сообщение от hoggy Посмотреть сообщение
тезис состоит из двух частей.
в первом утверждается, что результатом будет ссылка.
Любой, кто мало-мальски умеет читать на английском, подтвердит, что там такого не утверждается.



Цитата Сообщение от hoggy Посмотреть сообщение
занавес
Который скрывает от зрителей севшего в лужу hoggy.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.07.2017, 08:13

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

Указатели и ссылки 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 { ...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Опции темы

Новые блоги и статьи
Нейтральные знания ..., ... чистая наука. Пока что-то проходит модерацию на Хабре, стоит развить мысль ...
Hrethgir 20.07.2026
К таким радикальным взглядам я конечно в той публикации не приходил, но чтобы скоротать вечер, решил углубиться немного. 1. Почему показания термометра заряжены целью? Цель заложена в самом. . .
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ По ссылке 403. Не очень информативно такую ссылку постить. Запись от Usaga размещена Сегодня в 06:46 . . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru