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

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

08.07.2017, 18:55. Показов 12355. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энрегоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерировавны.
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru