810 / 405 / 83
Регистрация: 10.06.2014
Сообщений: 2,524
1

Указатель на ссылку или что это такое?

10.03.2017, 11:44. Показов 26839. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
void add(char aData, Branch *&aBranch);
Речь об аргументе aBranch.
Как это понимать? Указатель на ссылку? Не понятно. Вроде такое не имеет смысла
Или это своего рода упрощенное использование указателя на указатель?
Прошу объяснить

Добавлено через 6 минут
На СИшном компиляторе не компилится... Значит плюсовая фича
Но чего оно делает?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2017, 11:44
Ответы с готовыми решениями:

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения...

Нюансы синтаксиса: запись double *array - это указатель или что-то иное?
double *array * что это указатель или что?

Что такое хэндлер файла? Что такое файловый указатель?
Что такое хэндлер файла? Что такое файловый указатель?

Указатель на ссылку: как это использовать ?
Всем доброго времени суток форумчане. Решил для себя разобраться полностью с указателями и ссылками...

34
47 / 28 / 12
Регистрация: 23.01.2013
Сообщений: 125
10.03.2017, 12:26 2
Указателя на ссылку не может быть. А это ссылка на указатель.
В СИ нет ссылок, по этому не компилится,
1
Эксперт .NET
5865 / 4742 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
10.03.2017, 12:27 3
Цитата Сообщение от sys_beginner Посмотреть сообщение
Указатель на ссылку?
Это объявление функции, первым параметром принимающей ссылку на указатель.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
void change(int*&, int);
 
int main()
{
    int x = 100, y=200;
    int *p = &x;        //p получает адрес x
    std::cout << *p << std::endl; //100
    change(p, y);       //передаем в функцию p и y
    std::cout << *p << std::endl; //200 т.к. в p теперь адрес y
    return 0;
}
 
void change(int* &px, int x)
{
    px = &x; //параметр px получает адрес параметра x
}
1
810 / 405 / 83
Регистрация: 10.06.2014
Сообщений: 2,524
10.03.2017, 12:40  [ТС] 4
Даценд, greenlight,
Как я понял это может пригодится вместо использования указателя на указатель?
Можно передать ссылку на указатель и тогда внутри функции не будет создана локальная копия указателя и все изменения внутри функции будут отражены на внешнем указателе который передался как аргумент этой функции
Ну так удобнее просто
Я прав?
0
47 / 28 / 12
Регистрация: 23.01.2013
Сообщений: 125
10.03.2017, 12:49 5
Да. Можешь обнулять указатели например.
C++
1
2
3
4
void foo(int *&p)
{
    p = nullptr;
}
1
810 / 405 / 83
Регистрация: 10.06.2014
Сообщений: 2,524
10.03.2017, 12:53  [ТС] 6
greenlight,
Крутая фича А то приходится каждый раз брать адрес указателя чтоб передать указатель на указатель..

greenlight, Даценд,
Спасибо!

Добавлено через 2 минуты
Цитата Сообщение от sys_beginner Посмотреть сообщение
А то приходится каждый раз брать адрес указателя чтоб передать указатель на указатель..
А потом еще и разыменовывать указатель на указатель чтоб достучаться до адреса который нужен...
0
20 / 27 / 1
Регистрация: 14.03.2015
Сообщений: 792
10.03.2017, 14:05 7
Даценд, этот код выводит что-то не понятное
100
1592020704
0
Любитель чаепитий
3737 / 1796 / 563
Регистрация: 24.08.2014
Сообщений: 6,015
Записей в блоге: 1
10.03.2017, 14:16 8
Даценд, У локальных переменных свой адрес, так что тут UB.
Передавайте по ссылке.
2
Эксперт .NET
5865 / 4742 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
10.03.2017, 15:26 9
gogaloh, GbaLog-,
Да.
Странно, почему в CodeBlocks все работало?
Указатель на ссылку или что это такое?

А вот если и второй параметр передавать по ссылке, тогда будет правильно:
C++
1
2
3
4
void change(int* &px, int &x)
{
    px = &x; //параметр px получает адрес параметра x
}
0
Неэпический
17815 / 10586 / 2044
Регистрация: 27.09.2012
Сообщений: 26,628
Записей в блоге: 1
10.03.2017, 15:48 10
Цитата Сообщение от Даценд Посмотреть сообщение
Странно, почему в CodeBlocks все работало?
Память - она такая. Хранит то, что в неё запишут.
0
Эксперт .NET
5865 / 4742 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
10.03.2017, 16:02 11
Croessmah,
А почему тогда в VS не хранит?
Указатель на ссылку или что это такое?
0
Неэпический
17815 / 10586 / 2044
Регистрация: 27.09.2012
Сообщений: 26,628
Записей в блоге: 1
10.03.2017, 16:10 12
Цитата Сообщение от Даценд Посмотреть сообщение
А почему тогда в VS не хранит?
Память она такая - хранит то, что в неё записали.
Не важно кто и когда.
Вышли из функции - кадр стека уничтожился, память свободна.
Следующий вызов любой функции, например, может перезаписать данный участок.
1
17423 / 9256 / 2263
Регистрация: 30.01.2014
Сообщений: 16,208
10.03.2017, 16:17 13
Цитата Сообщение от Даценд Посмотреть сообщение
Странно, почему в CodeBlocks все работало?
UB в программе тем и страшно, что с ним до поры до времени может все работать. Поговорка же есть такая "правильно работающая программа - частный случай неопределенного поведения". Пока не сменится версия компилятора, или настройки оптимизации, или просто добавится код, который поменяет поведение с позитивного на негативное...
1
Неэпический
17815 / 10586 / 2044
Регистрация: 27.09.2012
Сообщений: 26,628
Записей в блоге: 1
10.03.2017, 16:18 14
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>
 
 
int &foo()
{
    int x = 160;
    return x;
}
 
 
int &bar()
{
    int x = 666;
    return x;
}
 
int main()
{
    int &x = foo();
    bar();
    std::cout << x << std::endl;
}
http://rextester.com/BJGY62496
0
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
10.03.2017, 16:51 15
Цитата Сообщение от sys_beginner Посмотреть сообщение
Как это понимать? Указатель на ссылку? Не понятно. Вроде такое не имеет смысла
Или это своего рода упрощенное использование указателя на указатель?
Прошу объяснить
Обменять местами два соседних элемента списка
1
810 / 405 / 83
Регистрация: 10.06.2014
Сообщений: 2,524
10.03.2017, 17:03  [ТС] 16
tapochka,
Уже разобрался, спасибо
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
23.12.2018, 13:48 17
Подскажите пожалуйста
C++
1
2
char a[] = "привет мир";
cout << &*a;
где - то тут видел что данная операция
C++
1
cout << &*a;
эквивалентна
C++
1
cout << a;
и то что компилятором игнорируются эти операции, так ли это? Или просто операции выполняются но выводят один и тот же результат? типа взятие адреса разыменованного указателя это получение адреса элемента на который он указывает тоже же самое как и вывод указателя в cout который принимает адрес первого элемента в массиве символов?
И еще вопрос, действительно ли то что для указателя на char выделяется отдельный адрес под "всю строку"(типа это же еще и адрес указателя) который принимает
C++
1
cout <<
и прочитывает всю строку до '\0' И выделяется другие адреса под каждый элемент в указателе на char начиная с первого элемента?
Иначе как можно объяснить тот факт что когда
C++
1
cout<<
получает разыменованный указатель на 1 элемент в массиве и выводит этот же первый элемент! И если получает Не разыменованный указатель То так же получает адрес первого элемента же?(если к указателю ничего не прибавлять) но выводит почему то всю строку?. как это устроено? или он все таки получает НЕ адрес первого элемента, а адрес указателя? что и говорит компилятору что надо выводить всю строку???как компилятор понимает выводить все элементы начиная с первого или только первый?
0
17423 / 9256 / 2263
Регистрация: 30.01.2014
Сообщений: 16,208
23.12.2018, 14:35 18
Цитата Сообщение от Achill Посмотреть сообщение
Иначе как можно объяснить тот факт что когда cout << получает разыменованный указатель на 1 элемент в массиве и выводит этот же первый элемент! И если получает Не разыменованный указатель То так же получает адрес первого элемента же?
Это объясняется перегрузкой оператор << для разных типов. Для перегрузки operator<<(std::ostream &, char c) выводится 1 символ (cout << *a;, где *a - это char). Для перегрузки operator<<(std::ostream &, char const * p) выводятся все символы в последовательности (cout << a;, где a - это массив char[N], приведенный к char const * в при передаче в функцию), ограничением который выступает байт со значением 0.
1
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
23.12.2018, 15:14 19
Этот момент понял, спасибо, а первый аргумент откуда получает? "std::ostream &" ? operator<<(std::ostream &, char const * p)
А на счет "cout << &*a" как обстоят дела? "&*" игнорируется компилятором и отправляется только "a"? а зачем тогда такая конструкция вообще "&*"?
0
17423 / 9256 / 2263
Регистрация: 30.01.2014
Сообщений: 16,208
23.12.2018, 15:42 20
Цитата Сообщение от Achill Посмотреть сообщение
а первый аргумент откуда получает?
Первый аргумент - это std::cout. Запись std::cout << a; - это синтаксический сахар для вот такого вызова operator<<(std::cout, a);.

Цитата Сообщение от Achill Посмотреть сообщение
А на счет "cout << &*a" как обстоят дела? "&*" игнорируется компилятором и отправляется только "a"?
В случае, если мы говорим о встроенных версиях * и & (т.е. об отсутствии их перегрузок) компилятор не порождает дополнительных инструкций для такой записи. Т.е. да, в вашем случае это эквивалентно.

Цитата Сообщение от Achill Посмотреть сообщение
а зачем тогда такая конструкция вообще "&*"?
В обобщенных алгоритмах, например при работе с итераторами, эта запись поможет вытащить настоящий адрес элемента. Там это важно как раз из-за возможной перегрузки operator* и\или operator&.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2018, 15:42
Помогаю со студенческими работами здесь

как такое правильно писать? это ссылка на указатель?
#include &lt;iostream&gt; using namespace std; char *chch2 = &quot;hello&quot;; char*&amp; f() { char...

Что такое указатель на член класса?
Что такое указатель на член класса?

Что такое указатель на абстрактный класс?
В задании сказано - Методы класса должны принимать указатель на абстрактный класс , что это значит...

Что такое указатель и с чем его есть
Я уже не знаю что делать, но в книжке очень непонятно написано про указатели. Не могли бы вы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru