Форум программистов, компьютерный форум CyberForum.ru

Объяснить, что делает операция *& и чем она отличается от простого указателя? - C++

Восстановить пароль Регистрация
 
 
Raketa
0 / 0 / 0
Регистрация: 31.01.2015
Сообщений: 146
09.05.2016, 11:05     Объяснить, что делает операция *& и чем она отличается от простого указателя? #1
Пожалуйста объясните что делает этот оператор...чем он отличается от простого указателя?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2016, 11:05     Объяснить, что делает операция *& и чем она отличается от простого указателя?
Посмотрите здесь:

C++ Чем ссылка отличается от указателя?
C++ Объяснить, что делает функция, подробно
go to mark что она делает C++
C++ Как создать прямоугольную матрицу и чем она отличается от квадратной?
C++ Побитовые операции, Что делает операция ^
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
09.05.2016, 15:12     Объяснить, что делает операция *& и чем она отличается от простого указателя? #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если же сравнивать p и ptr, то в обоих случаях значения будут одинаковыми.
Он уже Вас запутал. Если сравнивать :
p и ptr - разные
&p и &ptr - разные
*p и *ptr разные. //переданный не изменится вне функции
Или я ничего не понял из диалога.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
09.05.2016, 15:13     Объяснить, что делает операция *& и чем она отличается от простого указателя? #22
так и есть, запутал. Но код выше должен показать, что я хотел сказать.
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 17:10     Объяснить, что делает операция *& и чем она отличается от простого указателя? #23
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если же сравнивать p и ptr, то в обоих случаях значения будут одинаковыми.
- Вы опять неправду пишете. Случаи:
1) p остается в глобальном скоупе, ptr меняется;
2) p - в глобальном скоупе, но при изменении ptr, p меняется точно также, как будто это один указатель, а может это и есть один указатель?

Добавлено через 4 минуты
Цитата Сообщение от Toshkarik Посмотреть сообщение
Programmist5, Вы сравнивали p и ptr? Так это не правильно, нужно сравнивать ( &p и &ptr ).
- кстати если здесь говорится про указатели второго уровня, то это отдельная тема. В них все легко, ну в общем Интернете можно найти информацию.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2785 / 1431 / 393
Регистрация: 18.10.2014
Сообщений: 2,628
09.05.2016, 17:13     Объяснить, что делает операция *& и чем она отличается от простого указателя? #24
Цитата Сообщение от Raketa Посмотреть сообщение
C++
1
int AddElement2(CTreeElement *&el,string word)
В этом коде нет никакого "оператора *&". Единственное место, в котором встречается комбинация *& - процитировано выше. Однако это не "оператор", а просто синтаксический элемент объявления ссылки на указатель.

Добавлено через 2 минуты
Цитата Сообщение от Programmist5 Посмотреть сообщение
А, Toshkarik, это типа если написать *&, то остается связь между локальной переменной в функции и глобальной переменной в программе?
Да, именно так. Только "глобальность" тут ни при чем. Остается связь между параметром внутри функции и аргументом в вызывающем коде.
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 17:55     Объяснить, что делает операция *& и чем она отличается от простого указателя? #25
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Да, именно так. Только "глобальность" тут ни при чем. Остается связь между параметром внутри функции и аргументом в вызывающем коде.
- ну наконец-то услышал я слова согласия. Только этот параметр и есть одно и тоже число. Я понял, что спор тут ниочем. Toshkarik мы оба правы, только рассматриваем вопрос с разных сторон. Нужно было соглашаться со мной, а не спорить. Не было бы спора - не было бы путаницы.

Добавлено через 6 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Он уже Вас запутал. Если сравнивать :
p и ptr - разные
&p и &ptr - разные
*p и *ptr разные. //переданный не изменится вне функции
- просто втупую так сравнивать нельзя. В разных случаях будут разные результаты. Смотрите мои сообщения выше.
Это не я запутал, а создатель С запутал. Си вообще сложный язык и противоречивый, кстати. Ну ищите крайнего съездите в Америку, поищите там создателя Си.

Добавлено через 5 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В этом коде нет никакого "оператора *&". Единственное место, в котором встречается комбинация *& - процитировано выше. Однако это не "оператор", а просто синтаксический элемент объявления ссылки на указатель.
- я понимаю это не так. * говорит о передаче указателя. & говорит о том, что нужно создать точно такую же переменную. p и ptr имеют теже самые адреса и значения, то есть это как будто одно и тоже число, только с 2-мя именами.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
09.05.2016, 18:04     Объяснить, что делает операция *& и чем она отличается от простого указателя? #26
Цитата Сообщение от Programmist5 Посмотреть сообщение
- я понимаю это не так.
Важно не как понимаете Вы, важно как понимает компилятор.

Не по теме:

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

TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2785 / 1431 / 393
Регистрация: 18.10.2014
Сообщений: 2,628
09.05.2016, 18:06     Объяснить, что делает операция *& и чем она отличается от простого указателя? #27
Цитата Сообщение от Programmist5 Посмотреть сообщение
- я понимаю это не так. * говорит о передаче указателя. & говорит о том, что нужно создать точно такую же переменную. p и ptr имеют теже самые адреса и значения, то есть это как будто одно и тоже число, только с 2-мя именами.
Понимать это можно по-разному.

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

Но в "среднестатистическом" контексте, если не вдаваться в тонкости, можно действительно считать, что ссылка - это просто другое имя для той же самой переменной.

Добавлено через 38 секунд
Цитата Сообщение от Programmist5 Посмотреть сообщение
Си вообще сложный язык
А Си то тут при чем?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
09.05.2016, 18:56     Объяснить, что делает операция *& и чем она отличается от простого указателя? #28
Цитата Сообщение от Programmist5 Посмотреть сообщение
- просто втупую так сравнивать нельзя. В разных случаях будут разные результаты. Смотрите мои сообщения выше.
Вот место выше из которого растут ноги (кривые):
Объяснить, что делает операция *& и чем она отличается от простого указателя?
а именно фраза в ответ на:
Цитата Сообщение от Toshkarik Посмотреть сообщение
Programmist5, нет, в первом случае Вы передаете копию указателя. Во втором ссылку на него.
Цитата Сообщение от Programmist5 Посмотреть сообщение
вот это не правильно, ptr и p имеют одинаковый адрес, т.е. это одно и то же. По-крайней мере у меня в C++Builder 6 так.
То есть, Вы не то что бы не понимаете, что ссылка и её объект имеют один и тот же адрес/размер и пр. Более того, ссылка не имея собственного объекта как раз и ссылается на объект для которого объявлена. Вы этого просто не знаете и уверены в своей правоте. Которая ничем не обоснована.
Участвовать в данной теме больше не считаю нужным. Почитайте хотя бы самые базовые вещи перед тем как спорить.
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 20:10     Объяснить, что делает операция *& и чем она отличается от простого указателя? #29
Цитата Сообщение от daslex Посмотреть сообщение
Сложный не язык. Такие заявления делают только в том случае, если в голове бардак.
- хорошо, найди мне сайт который описывает оператор & в данном контексте.

Добавлено через 6 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, Вы не то что бы не понимаете, что ссылка и её объект имеют один и тот же адрес/размер и пр. Более того, ссылка не имея собственного объекта как раз и ссылается на объект для которого объявлена. Вы этого просто не знаете и уверены в своей правоте. Которая ничем не обоснована.
Участвовать в данной теме больше не считаю нужным. Почитайте хотя бы самые базовые вещи перед тем как спорить.
- не нужно оскорблять меня, я знаю базовые вещи, а то я щас тебя сам отправлю учиться. Точно помню, что во втором случае p и ptr имели абсолютно одинаковые адреса. А то, что вы приводиет эту цитату:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Programmist5, нет, в первом случае Вы передаете копию указателя. Во втором ссылку на него.
- которую сказал Toshkarik. Во втором случае НЕ делается ссылка на указатель, т.е. не делается указатель 2-го уровня, их вообще здесь нет. Создается второе имя(ptr) той же переменной(p).
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2785 / 1431 / 393
Регистрация: 18.10.2014
Сообщений: 2,628
09.05.2016, 20:34     Объяснить, что делает операция *& и чем она отличается от простого указателя? #30
Цитата Сообщение от Programmist5 Посмотреть сообщение
Во втором случае НЕ делается ссылка на указатель, т.е. не делается указатель 2-го уровня, их вообще здесь нет. Создается второе имя(ptr) той же переменной(p).
Это уже какая-то каша из теоретических концепций и практических реализаций. Вы уже определитесь, о чем вы говорите.

Думать о ссылке, как о "втором имени той же переменой" можно, но только в теоретическом контексте.

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

А уж как вам больше нравится "думать" о ссылках: как о втором имени для переменной или как о замаскированном указателе - это ваше личное дело. К тому же эта два варианта никак друг друга не исключают, поэтому спорить тут не о чем.
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 20:39     Объяснить, что делает операция *& и чем она отличается от простого указателя? #31
Спорить тут не о чем, это точно. Я понял p и ptr - это указатели одного и того же 1-го уровня(см. 2-й случай). Слава Богу, спор закончился, но теоретические сведения по поводу символа & в данном контексте можешь мне выслать drislex.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
09.05.2016, 20:45     Объяснить, что делает операция *& и чем она отличается от простого указателя? #32
Цитата Сообщение от Programmist5 Посмотреть сообщение
- хорошо, найди мне сайт который описывает оператор & в данном контексте.
Во всех контекстах языка C++ - это ссылка на указатель.

На вопрос:
Цитата Сообщение от Programmist5 Посмотреть сообщение
Если честно не понял разницы между:
Я Вам примел привёл, Вы его не увидели?

Я не знаю о чём Вы спорите. Я не знаю чего Вы ещё хотите.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
09.05.2016, 20:50     Объяснить, что делает операция *& и чем она отличается от простого указателя? #33
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Думать о ссылке, как о "втором имени той же переменой" можно, но только в теоретическом контексте.
Налицо путаница между ссылкой в скоупе объявления и ссылке как параметре функции. В первом случае ссылка это синоним, с возможно суженными правами. А при объявлении параметра ссылки никакой ссылки вообще нет. В этом случае меняется соглашение о том как передаётся переменная. А реализация уже выполняет контракт и обычно через скрытый указатель.
Цитата Сообщение от Programmist5 Посмотреть сообщение
Точно помню, что во втором случае p и ptr имели абсолютно одинаковые адреса.
Они и имеют. Я это и имел ввиду. Это потому что в функции создана ссылка которая ссылается аж прямо на ту переменную на которую ссылается. Это и говорит о том что это переменная и ссылка на неё.
TheCalligrapher, как раз и говорит, что реализовывать такое поведение приходится при помощи указателя. Код функции не может знать ничего о той области стека из которой он вызывается и переменные оттуда либо копируются либо передаются адресно. Оскорблений в ваш адрес с моей стороны не было и тыкать мне больше не нужно. Всего доброго.
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2785 / 1431 / 393
Регистрация: 18.10.2014
Сообщений: 2,628
09.05.2016, 23:49     Объяснить, что делает операция *& и чем она отличается от простого указателя? #34
Цитата Сообщение от IGPIGP Посмотреть сообщение
Налицо путаница между ссылкой в скоупе объявления и ссылке как параметре функции. В первом случае ссылка это синоним, с возможно суженными правами. А при объявлении параметра ссылки никакой ссылки вообще нет. В этом случае меняется соглашение о том как передаётся переменная. А реализация уже выполняет контракт и обычно через скрытый указатель.
Не совсем понимаю, в чем ценность утверждения "никакой ссылки вообще нет". Почему нет? С точки зрения языка, нет никакого разницы между ссылками, где бы они ни были объявлены: в локальном scope, в списке параметров функции, среди полей класса.

Зачем вводить какие-то разделение между этими контекстами? Что это дает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2016, 01:14     Объяснить, что делает операция *& и чем она отличается от простого указателя?
Еще ссылки по теме:

C++ Что делает операция new?
Объяснить, что делает каждый цикл в программе C++
Что делает операция >>? C++

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
10.05.2016, 01:14     Объяснить, что делает операция *& и чем она отличается от простого указателя? #35
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Не совсем понимаю, в чем ценность утверждения "никакой ссылки вообще нет".
Сейчас попробую объяснить, что я имел ввиду. Когда в функции объявлен формальный параметр типа T, то это значит, что функция ожидает объект типа Т или типа, который неявно приводится к..., что в данном контексте одно и то же. Ссылка отличается от обычных типов тем, что там, где объявлено T & вовсе не ожидается ссылка на T (хотя её можно туда передать)), а в большинстве случаев ожидается именно объект типа T. Как уж это реализуется, через указатель ли, через резервирование в статической памяти (безумие) места для глобальных объектов не суть. Важно, что данное объявление меняет контракт.
Дело в том, что с моей точки зрения, инициализация ссылки, - формального параметра внешней переменной не логична. Почему это мы в новой рабочей области, инициализируем ссылку объектом из зоны вызова, а не его копией? Тут имеет место именно соглашение, а атрибутика ссылки только запутывает. Если бы формальный параметр объявлялся как-нибудь T# и называлось это передачей по происхождению (), это работало бы ничуть не хуже и не могло бы быть спутано с ссылкой в пределах одной области, для которой осталось бы T &.
Всё сказанное более чем спорно, но я имел ввиду именно это. Объявление ссылки в области, - объявление синонима, а объявление ссылки формальным параметром не означает, что передавать нужно именно ссылку. В этом смысле там нет требования передавать ссылку. У других типов есть требование передавать тип. В этом смысле, опять же, объявление переменной (не ссылочной) в области и в качестве параметра, наоборот, - родственны и по виду и по действию.
Yandex
Объявления
10.05.2016, 01:14     Объяснить, что делает операция *& и чем она отличается от простого указателя?
Ответ Создать тему
Опции темы

Текущее время: 07:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru