192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
1

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

19.08.2018, 16:33. Показов 4897. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток форумчане. Решил для себя разобраться полностью с указателями и ссылками и по ходу чтения инфы столкнулся с такой записью выражения
C++
1
Type &*x;
Согласно приоритету операторов у & и * приоритет одинаковый и если они встречаются вместе то нужно смотреть слева направо.

Это читается как указатель на ссылку если я не ошибаюсь и смысл вроде понятен, просто "указатель на ССЫЛКУ", но не могу понять как это использовать и чему надо это присвоить. Пытался даже методом перебора присвоить ему что нибудь но не получается.

Тут всё и так ясно, ссылка на указатель и ссылка на указатель на указатель
C++
1
2
3
4
    int *p1, **p2;
 
    int *&s1 = p1;
    int **&s2 = p2;
А здесь что то непонятно
C++
1
2
3
    int a = 1;
    int &aa = a;
    int &*x = aa;
Есть такое подозрение что ссылку на указатель нужно объявлять во время того как ты сам объявляешь ссылку, ведь ссылку же нельзя просто объявить а потом ей что то присвоить.
Типа что то такого
C++
1
int &*x = int &aa; // Не знаю мож бред говорю
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2018, 16:33
Ответы с готовыми решениями:

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать?
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это...

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

Указатель на ссылку или что это такое?
void add(char aData, Branch *&aBranch); Речь об аргументе aBranch. Как это понимать? Указатель на...

Как создать ссылку на двойной указатель?
Как создать ссылку на двойной указатель?

26
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
19.08.2018, 17:11 2
Цитата Сообщение от no swear Посмотреть сообщение
int a = 1;
* * int &aa = a;
* * int &*x = aa;
Оно компилируется?
1
2761 / 1915 / 569
Регистрация: 05.06.2014
Сообщений: 5,571
19.08.2018, 17:13 3
Цитата Сообщение от no swear Посмотреть сообщение
Это читается как указатель на ссылку если я не ошибаюсь и смысл вроде понятен, просто "указатель на ССЫЛКУ", но не могу понять как это использовать и чему надо это присвоить.
Никак - компилятор не разрешает, IDE подчеркивает.
C++
1
using Test=int&*;//ошибка: cannot declare pointer to ‘int&’
1
"C with Classes"
1634 / 1392 / 521
Регистрация: 16.08.2014
Сообщений: 5,828
Записей в блоге: 1
19.08.2018, 17:13 4
no swear, E0248 использование указателя на ссылку не допускается
1
Эксперт С++
1623 / 953 / 782
Регистрация: 06.02.2016
Сообщений: 2,449
Записей в блоге: 30
19.08.2018, 17:15 5
no swear, Может вы что-то подобное видели?
C++
1
2
3
   int x=5;
   int *p=&x;
   std::cout<<&*p;
Здесь конструкция &* просто выводит адрес разыменованного объекта
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
19.08.2018, 18:59  [ТС] 6
Цитата Сообщение от Peoples Посмотреть сообщение
Оно компилируется?
Нет

Цитата Сообщение от _stanislav Посмотреть сообщение
E0248 использование указателя на ссылку не допускается
Это какое то правило? Я о E0248.

Цитата Сообщение от Peoples Посмотреть сообщение
Может вы что-то подобное видели?
Нет. Я увидел это на ХАБРЕ и явно понял не так, сказанное следующее в статье о ссылках, указателях и массивах выглядит так:
Кликните здесь для просмотра всего текста
Также замечу, что &*EXPR (здесь EXPR — это произвольное выражение, не обязательно один идентификатор) эквивалентно EXPR всегда, когда имеет смысл (т. е. всегда, когда EXPR — указатель), а *&EXPR тоже эквивалентно EXPR всегда, когда имеет смысл (т. е. когда EXPR — ссылка).


Здесь имеется ввиду совсем другое, то есть если взять указатель EXPR, разыменовать его *EXPR, а потом "взять" адрес с разыменованного значения *&EXPR то он будет эквивалентен EXPR, т. е. &*EXPR = EXPR.

Поздно это понял.
0
17423 / 9256 / 2263
Регистрация: 30.01.2014
Сообщений: 16,208
19.08.2018, 19:03 7
Цитата Сообщение от no swear Посмотреть сообщение
Это какое то правило?
http://eel.is/c++draft/dcl.ref#5
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
19.08.2018, 19:04  [ТС] 8
Цитата Сообщение от Peoples Посмотреть сообщение
Может вы что-то подобное видели?
Вы мне помогли понять что имелось ввиду в статье своим кодом
C++
1
2
3
   int x=5;
   int *p=&x;
   std::cout<<&*p; // вот :)
0
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
19.08.2018, 19:46 9
Цитата Сообщение от Peoples
Здесь конструкция &* просто выводит адрес разыменованного объекта
Нет, она просто игнорируется )

Добавлено через 4 минуты
&*E is equivalent to E (even if E is a null pointer), and &(E1[E2]) to ((E1)+(E2)). It is always true that if E is a function designator or an lvalue that is a valid operand of the unary & operator, *&E is a function designator or an lvalue equal to E. If *P is an lvalue and T is the name of an object pointer type, *(T)P is an lvalue that has a type compatible with that to which T points.
^^^
1
"C with Classes"
1634 / 1392 / 521
Регистрация: 16.08.2014
Сообщений: 5,828
Записей в блоге: 1
19.08.2018, 19:50 10
Цитата Сообщение от no swear Посмотреть сообщение
Это какое то правило?
это ошибка в студии 17
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
19.08.2018, 20:06  [ТС] 11
Captain Maxee, Здравствуйте
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Нет, она просто игнорируется )
Она правда игнорируется компилятором если встречает такую последовательность символов? Это как если
C++
1
    if ( a && (...) )
Если a не выполниться то и на остальное не будет обращено внимания?
0
5 / 5 / 1
Регистрация: 20.07.2018
Сообщений: 24
19.08.2018, 20:17 12
Если сравнивать ссылку с константным указателем (понятно,что вся рутина для ссылок убрана),то возможно как-то отталкиваться от этого?

Ну то есть, попробовать рассматривать поверхностно как указатели (опять же,я понимаю,что это всё таки не так):

C++
1
2
3
4
5
6
7
//Было
int first = 13;
int& second = first;
 
//Стало
int first = 13;
int* const second = &first;
Тогда может быть как-то будет проще додумать,зачем вообще это может быть нужно?
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
19.08.2018, 20:34  [ТС] 13
Mizofix, Всё же ссылки и указатели это два разных способа интерпретировать адрес.
Они одновременно так похожи друг на друга и такие разные. Я не могу пока что уловить(почувствовать) ту грань между ними которая их разделяет(и одновременно объединяет)
0
5 / 5 / 1
Регистрация: 20.07.2018
Сообщений: 24
19.08.2018, 20:39 14
no swear, да,действительно. С такой аналогией можно быстрее и запутаться.Я когда-то тоже думал об указателе не ссылку и наоборот,но мне показалось это ненужным.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
19.08.2018, 21:05 15
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Нет, она просто игнорируется )
Твоя цитата из стандарта C, а тут раздел про C++ )
2
Комп_Оратор)
Эксперт по математике/физике
8853 / 4594 / 620
Регистрация: 04.12.2011
Сообщений: 13,719
Записей в блоге: 16
19.08.2018, 23:23 16
Цитата Сообщение от Mizofix Посмотреть сообщение
o swear, да,действительно. С такой аналогией можно быстрее и запутаться.
Легко. Я почитал и потерял связь с содержанием.
no swear, указатели на ссылки неразрешено создавать потому, что ссылки не имеют адресов. То есть, они не являются объектами какого либо типа. Они предоставляют доступ к уже созданным объектам, но ничего "своего" у них нет. Не размера ни адреса. Это значит, что сравнивать указатель и ссылку нельзя. Ссылка, это некий синтаксический сахар контракт, за которым скрывается непосредственно объект, на который она указывает. А указатель, это нормальный объект. Под него выделяется память, он имеет значение. А уж разыменование/разадресация/раскрытие (чего только не придумано!), это операция доступа к объекту на который указывает адрес. А ссылка это синоним и попытка взятия адреса даст адрес целевого объекта. Это по типу - указатель на целевой объект (а не на ссылку). Это означает, что такой тип как указатель на ссылку не просто бесолезен. Он вреден, как сама по себе попытка.
1
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
19.08.2018, 23:56 17
Цитата Сообщение от rat0r
Твоя цитата из стандарта C, а тут раздел про C++ )
Хорошее замечание. Мне кажется, эту строку убрали из-за возможности перегрузки операторов. Однако, для стандартных операторов это правило действует именно так ( не уверен ).

Добавлено через 2 минуты
Цитата Сообщение от Captain Maxee
Однако, для стандартных операторов это правило действует именно так ( не уверен ).
Имею в виду для типов, где операторы * и ( или ) & не перегружены.
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
20.08.2018, 00:22  [ТС] 18
IGPIGP, Здравствуйте, спасибо за объяснение, более менее начал понимать почему нельзя создавать указатель на ссылку. Нужно ещё немного времени чтобы всё обдумать

Но меня беспокоит ещё куча вопросов связанных с ссылками и один из них такой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdio>
#include <iostream>
#include <clocale>
 
void f(int (&a)[5]) {
 
}
 
int main()
{
    int x[5];
    f(x);
    f(&x); // неправильно
    
    if(reinterpret_cast<void *>(&x) == reinterpret_cast<void *>(x)) {
        std::cout << "True";
    } else {
        std::cout << "False";
    }
    return 0;
}
Почему f(&x) это неправильно. Я знаю что &x - int (*)[5], x - int *, но почему так а не иначе, зачем усложнять? и это не единственный пример.

С появлением ссылок в C++ ПО МОЕМУ МНЕНИЮ путаницы стало намного больше, указателей хватало с их и так непростой структурой а тут ещё ссылки. Как по мне указатели для меня более лаконичнее выглядят, когда работаешь с ними знаешь что они "существуют",
не как ссылки, какая у них структура, где они вообще располагаются в памяти, а как таковой памяти у них то и нет и адреса получить нельзя
указателями можно оперировать, менять адрес значения на которое указатель ссылается, менять сам адрес приводить к разным типам,
а ссылки? А ссылки ничего этого не умеют и тем не менее по сложности в изучении они не уступают указателям и даже превосходят их(наверное).

Я не вижу смысла в ссылках, чтобы вот "без них никак" не получается. С указателями реально НИКАК а ссылки можно заменить указателями в работе и что изменится, не думаю что изменения буду кардинальными
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
20.08.2018, 00:35 19
Цитата Сообщение от no swear Посмотреть сообщение
&x - int (*)[5], x - int *
&x - int (*)[5], x - int[5]
1
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
20.08.2018, 00:40  [ТС] 20
Цитата Сообщение от rat0r Посмотреть сообщение
x - int[5]
Так напишите такое в функции
C++
1
2
3
4
5
6
7
8
void f(int x[5]) {
 
}
 
int main() {
    int x[5];
    f(x);
}
void f(int x[5]) - x[5] преобразуется в указатель(int *), и неважно что написано в квадратных скобках поэтому их обычно оставляют пустыми.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2018, 00:40
Помогаю со студенческими работами здесь

Как передать двойной указатель не через ссылку?
Не выводит значение двойного указателя. Скорее всего он уничтожается при выходе из функции, а как...

Как указать ссылку на указатель в качестве формального параметра
Здравствуйте! Есть функция включения элементов в стек. Как правильно написать прототип функции....

Как создать простейшую ссылку/указатель на ячейку памяти/переменную
Здраствуйте. Подскажите пожалуйста, как сделать простейшую ссылку/указатель на яч памяти. ...

Как сделать указатель/ссылку на метод конкретного экземпляра класса
Добрый день. Подскажите можно ли в c++ каким либо образом объявить указатель/ссылку на функцию...


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

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

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