Форум программистов, компьютерный форум 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++ Побитовые операции, Что делает операция ^
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 11:11     Объяснить, что делает операция *& и чем она отличается от простого указателя? #2
Приведи пример кода откуда ты его взял. Просто, что-то я не припоминаю таких операторов.
Raketa
0 / 0 / 0
Регистрация: 31.01.2015
Сообщений: 146
09.05.2016, 11:14  [ТС]     Объяснить, что делает операция *& и чем она отличается от простого указателя? #3
Programmist5,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int AddElement2(CTreeElement *&el,string word)
{
    if(word.length()>0)
    {
        if(nullptr == el)
        {
            el = new CTreeElement(word[0]);
            if(word.length()>1)
                AddElement2(el->Left,word.substr(1,word.length()-1));
            else
                el->EndWord = true;
        }
        else
        {
            if(el->symbol ==word[0])
                AddElement2(el->Left,word.substr(1,word.length()-1));
            else
                AddElement2(el->Right,word);
        }
    }
    return 0;
}
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 11:30     Объяснить, что делает операция *& и чем она отличается от простого указателя? #4
У Вас этот код компилируется? Если компилируется, то в чем Вы пишете?
Raketa
0 / 0 / 0
Регистрация: 31.01.2015
Сообщений: 146
09.05.2016, 11:32  [ТС]     Объяснить, что делает операция *& и чем она отличается от простого указателя? #5
Programmist5, код компилируется и работает...но если использовать просто указатель то он работает не корректно...так я хочу узнать что это такое(*&) никогда раньше не видел...гугл не катит...найти ничего не могу
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
09.05.2016, 11:35     Объяснить, что делает операция *& и чем она отличается от простого указателя? #6
Вместо "CTreeElement *&el" напиши "CTreeElement* &el" (в другом месте пробел), может так понятнее будет, какой символ к чему относится. Ну или на худой конец

C++
typedef CTreeElement* ptr;
int AddElement2 (ptr &el)
Raketa
0 / 0 / 0
Регистрация: 31.01.2015
Сообщений: 146
09.05.2016, 11:36  [ТС]     Объяснить, что делает операция *& и чем она отличается от простого указателя? #7
Evg, спасибо
Lawliet1
29 / 32 / 11
Регистрация: 30.09.2011
Сообщений: 202
Завершенные тесты: 1
09.05.2016, 11:36     Объяснить, что делает операция *& и чем она отличается от простого указателя? #8
это ссылка на указатель.
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 11:37     Объяснить, что делает операция *& и чем она отличается от простого указателя? #9
НУ вот я в биледере пишу 6 версии. Старовато, но что делать. 1) Он пишет, что нельзя объявлять параметр функции как "CTreeElement", да и я вообще не знаю что это такое. Первое, что приходит на ум это элемент TTreeView - ну дерево короче обычное, VCL-элемент, т.е. графический элемент, у Вас он или не он я не знаю.
2) Ну и такой конструкции я не встречал. Обычно пишут:
* - указатель;
& - взять адрес.
Lawliet1
29 / 32 / 11
Регистрация: 30.09.2011
Сообщений: 202
Завершенные тесты: 1
09.05.2016, 11:43     Объяснить, что делает операция *& и чем она отличается от простого указателя? #10
Вот наглядный код который демонстрирует, что это такое и с чем его есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
//===============================================
 
void deletePointer (int*& ptr)
{
    std::cout << ptr << std::endl;
    delete[] ptr;
    ptr = nullptr;
}
 
int main()
{
    auto p = new int[10]();
    std::cout << p << std::endl;
    deletePointer(p);
    
    if (!p)
        std::cout << "p = nullptr" << std::endl;
 
    return 0;
}
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 13:16     Объяснить, что делает операция *& и чем она отличается от простого указателя? #11
Цитата Сообщение от Evg Посмотреть сообщение
typedef CTreeElement* ptr;
- указатель на куст что-ли? Поделитесь секретиком что означает элемент CTreeElement?

Добавлено через 56 минут
Если честно не понял разницы между:
C++
1
2
3
4
function(int*& m)
{
//...
}
и
C++
1
2
3
4
function(int* m)
{
//...
}
Компилятор у меня C++Builder 6. Вроде не устарел еще.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
09.05.2016, 13:48     Объяснить, что делает операция *& и чем она отличается от простого указателя? #12
Programmist5, возможно, так понятней будет:
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 ) {
   ptr = &b;
}
 
void g( int *&ptr ) {
   ptr = &b;
}
 
int main() {
   int *p = &a; 
   
   std::cout << *p << std::endl;
   
   f( p );
 
   std::cout << *p << std::endl;
 
   g( p );
 
   std::cout << *p << std::endl;
   
   return 0;
}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
09.05.2016, 14:13     Объяснить, что делает операция *& и чем она отличается от простого указателя? #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <clocale>
using namespace std;
 
void foo1(int* m) { m =new int{10};}
void foo2(int*& m){ m = new int{10};}
 
 
int main()
{
    int *ptr = NULL;
 
   // foo1(ptr);    cout << *ptr << '\n';
    foo2(ptr);    cout << *ptr << '\n';
 
}
Ощути разницу, раскрой комментарий.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,697
Записей в блоге: 3
09.05.2016, 14:16     Объяснить, что делает операция *& и чем она отличается от простого указателя? #14
Raketa, ссылка может быть объявлена на всё. Кроме ссылки. На указатель ссылка объявляется так же как и на любой другой тип.
C++
1
2
3
4
5
T a;//a это переменная типа T
T &ref_a=a;//ref_a это ссылка на a
 
T *ptr_a =&a;//ptr_a это переменная хранящая адрес переменной a (то есть ptr_a это указатель на a)
T *&ref_ptr_a=ptr_a;//ref_ptr_a это ссылка на указатель на переменную a
Когда ссылка объявлена параметром функции, это не значит, что нужно передать ссылку, а это значит, что не будет передачи копии (передачи по значению), а будет передача по ссылке. Для передачи указателя по ссылке это будет иметь тот же смысл, что и для любой другой переменной передаваемой по ссылке.
Сделано, это с той же целью, что и для других переменных, то есть для упрощения синтаксиса по сравнению с передачей по указателю. Например, чтобы выделить динамическую память по указателю, переданному в функцию, нужно в неё передать указатель на этот указатель. Иначе, если передать сам указатель, то адрес выделенной памяти попадёт в копию и кроме утечки ничего не произойдёт. Передавать указатель на указатель, это писать две звезды. А в функции разыменовывать. А потом ещё их читать придётся когда-нибудь. Поэтому, легче передать указатель по ссылке.
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 14:22     Объяснить, что делает операция *& и чем она отличается от простого указателя? #15
А, Toshkarik, это типа если написать *&, то остается связь между локальной переменной в функции и глобальной переменной в программе?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
09.05.2016, 14:26     Объяснить, что делает операция *& и чем она отличается от простого указателя? #16
Programmist5, нет. Это значит, что Вы можете изменять сам указатель, а не только объект на который он указывает.
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 14:39     Объяснить, что делает операция *& и чем она отличается от простого указателя? #17
Я не так понял.
Случай 1(со *):
передаем ссылку ptr в указатель, изменяем ссылку m внутри подпрограммы, выходим и не изменяется указатель ptr.
Случай 2(со *&):
передаем ссылку ptr в указатель, изменяем ссылку m внутри подпрограммы, выходим и изменяется сам указатель ptr.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
09.05.2016, 14:52     Объяснить, что делает операция *& и чем она отличается от простого указателя? #18
Programmist5, нет, в первом случае Вы передаете копию указателя. Во втором ссылку на него.
Programmist5
 Аватар для Programmist5
-33 / 11 / 2
Регистрация: 07.05.2016
Сообщений: 90
09.05.2016, 15:00     Объяснить, что делает операция *& и чем она отличается от простого указателя? #19
Цитата Сообщение от Toshkarik Посмотреть сообщение
Programmist5, нет, в первом случае Вы передаете копию указателя.
- это правильно.
Цитата Сообщение от Toshkarik Посмотреть сообщение
Во втором ссылку на него.
- вот это не правильно, ptr и p имеют одинаковый адрес, т.е. это одно и то же. По-крайней мере у меня в C++Builder 6 так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2016, 15:09     Объяснить, что делает операция *& и чем она отличается от простого указателя?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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;
}
Yandex
Объявления
09.05.2016, 15:09     Объяснить, что делает операция *& и чем она отличается от простого указателя?
Ответ Создать тему
Опции темы

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