Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Raketa
0 / 0 / 0
Регистрация: 31.01.2015
Сообщений: 192
#1

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

09.05.2016, 11:05. Просмотров 697. Ответов 34
Метки нет (Все метки)

Пожалуйста объясните что делает этот оператор...чем он отличается от простого указателя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2016, 11:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Объяснить, что делает операция *& и чем она отличается от простого указателя? (C++):

Чем ссылка отличается от указателя? - C++
чем ссылка отличается от указателя?

Чем оператор || отличается от оператора && ? - C++
Приведите простые примеры, никак до мозгов не доходит)

Чем _Get_pointer_type отличается от обычного получения типа указателя - C++
При попытке более детально понять работу стандартных контейнеров в STD столкнулся с немалым количеством головоломок. вот одна из них. ...

Что делает операция new? - C++
spis *newl; newl=new spis(temp); что делает операция new spis(temp); П.с spis *temp spis::spis(spis*&temp)

Что делает операция >>? - C++
что значит знак ">>"? Например: d = zt >> 15

Как создать прямоугольную матрицу и чем она отличается от квадратной? - C++
Как создать прямоугольную матрицу и чем она отличается от квадратной?

34
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
09.05.2016, 14:26 #16
Programmist5, нет. Это значит, что Вы можете изменять сам указатель, а не только объект на который он указывает.
0
Programmist5
Заблокирован
09.05.2016, 14:39 #17
Я не так понял.
Случай 1(со *):
передаем ссылку ptr в указатель, изменяем ссылку m внутри подпрограммы, выходим и не изменяется указатель ptr.
Случай 2(со *&):
передаем ссылку ptr в указатель, изменяем ссылку m внутри подпрограммы, выходим и изменяется сам указатель ptr.
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
09.05.2016, 14:52 #18
Programmist5, нет, в первом случае Вы передаете копию указателя. Во втором ссылку на него.
0
Programmist5
Заблокирован
09.05.2016, 15:00 #19
Цитата Сообщение от Toshkarik Посмотреть сообщение
Programmist5, нет, в первом случае Вы передаете копию указателя.
- это правильно.
Цитата Сообщение от Toshkarik Посмотреть сообщение
Во втором ссылку на него.
- вот это не правильно, ptr и p имеют одинаковый адрес, т.е. это одно и то же. По-крайней мере у меня в C++Builder 6 так.
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
09.05.2016, 15:09 #20
Programmist5, Вы сравнивали p и ptr? Так это не правильно, нужно сравнивать ( &p и &ptr ).

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

Добавлено через 52 секунды
Если же сравнивать p и ptr, то в обоих случаях значения будут одинаковыми.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
 
 
int a = 5;
int b = 10;
 
void f( int *ptr ) {
   std::cout << "f(): pointer value = " << static_cast< void * >( ptr ) << std::endl;
   std::cout << "f(): pointer address = " << static_cast< void * >( &ptr ) << std::endl;
}
 
void g( int *&ptr ) {
   std::cout << "g(): pointer value = " << static_cast< void * >( ptr ) << std::endl;
   std::cout << "g(): pointer address = " << static_cast< void * >( &ptr ) << std::endl;
}
 
int main() {
   int *p = &a; 
   
   std::cout << "main(): pointer value = " << static_cast< void * >( p ) << std::endl;
   std::cout << "main(): pointer address = " << static_cast< void * >( &p ) << std::endl;
 
   f( p );
 
   g( p );
 
   
   return 0;
}
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6967 / 3258 / 327
Регистрация: 04.12.2011
Сообщений: 9,020
Записей в блоге: 5
09.05.2016, 15:12 #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если же сравнивать p и ptr, то в обоих случаях значения будут одинаковыми.
Он уже Вас запутал. Если сравнивать :
p и ptr - разные
&p и &ptr - разные
*p и *ptr разные. //переданный не изменится вне функции
Или я ничего не понял из диалога.
1
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
09.05.2016, 15:13 #22
так и есть, запутал. Но код выше должен показать, что я хотел сказать.
1
Programmist5
Заблокирован
09.05.2016, 17:10 #23
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если же сравнивать p и ptr, то в обоих случаях значения будут одинаковыми.
- Вы опять неправду пишете. Случаи:
1) p остается в глобальном скоупе, ptr меняется;
2) p - в глобальном скоупе, но при изменении ptr, p меняется точно также, как будто это один указатель, а может это и есть один указатель?

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

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

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

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

Не по теме:

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

0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4307 / 2326 / 575
Регистрация: 18.10.2014
Сообщений: 3,965
09.05.2016, 18:06 #27
Цитата Сообщение от Programmist5 Посмотреть сообщение
- я понимаю это не так. * говорит о передаче указателя. & говорит о том, что нужно создать точно такую же переменную. p и ptr имеют теже самые адреса и значения, то есть это как будто одно и тоже число, только с 2-мя именами.
Понимать это можно по-разному.

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

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

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

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

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

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

А уж как вам больше нравится "думать" о ссылках: как о втором имени для переменной или как о замаскированном указателе - это ваше личное дело. К тому же эта два варианта никак друг друга не исключают, поэтому спорить тут не о чем.
2
09.05.2016, 20:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2016, 20:34
Привет! Вот еще темы с ответами:

Побитовые операции, Что делает операция ^ - C++
Здравствуйте! Что делает эта операция? char * a; for (int i=0;i&lt;n;i++) a= a^&quot;$&quot;;

Объяснить, что делает std::lock_guard ? - C++
привет. Я правильно понял, что объект std::lock_guard, примененный к мьютексу в блоке кода, при выходе из этого блока разблокирует этот...

Объяснить, что делает функция, подробно - C++
cin.rdbuf()-&gt;in_avail() Добавлено через 19 секунд И что такое rdbuf

Объяснить, что делает каждый цикл в программе - C++
Объясните пожалуйста что делает каждый цикл for (i = 0; i &lt; n; i++) cout &lt;&lt; a &lt;&lt; &quot; &quot;;//выводим последовательность cout &lt;&lt;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru