Последовательность указателя ссылочного типа - PullRequest
2 голосов
/ 23 марта 2019

Как передать переменную-указатель в качестве ссылочного параметра?

У меня есть дополнительный вопрос по этому вопросу.

Ответчик в вопросе использует int*& как тип данных параметра, но я не понимаю последовательность указателя и ссылочного типа данных.

На мой взгляд, int&* выглядит для меня более практичным, поэтому я попытался скомпилировать это, но это было запрещено.

Я хочу ясно понять эту логику.

Я думал int*& a как int*(int& a), так что это похоже на указатель ссылки, но, очевидно, это было как раз наоборот.

Почему я не могу использовать int&*как значение ссылки на указатель?

Ответы [ 3 ]

2 голосов
/ 23 марта 2019

Правило по часовой стрелке / спираль

Существует три простых шага:

  1. Начиная с неизвестного элемента, двигаться по спирали / по часовой стрелке; при обнаружении следующих элементов замените их на соответствующие английские утверждения: [X] или [] => Размер массива X ... или Размер неопределенного массива ... (тип1, тип2) => функция, передающая type1 и type2, возвращающая ... * => указатели на ...
  2. Продолжайте делать это по спирали / по часовой стрелке, пока все жетоны не будут закрыты.
  3. Всегда сначала разрешайте все в скобках!
               +---------+  
               | +-----+ |
               | | +-+ | |
               | | ^ | | |
           int * & t ; | |
            ^  ^ ^   | | |
            |  | +---+ | |
            |  +-------+ |
            +------------+

Заявление от t, поэтому:

т это ...

Затем мы видим ;, поэтому продолжаем идти и видим &, поэтому

t является ссылкой на ...

Тогда мы видим *

t является ссылкой на указатель на ...

Тогда мы видим int:

t является ссылкой на указатель на int

Это имеет смысл. Теперь давайте попробуем другой:

               +---------+  
               | +-----+ |
               | | +-+ | |
               | | ^ | | |
           int & * t ; | |
            ^  ^ ^   | | |
            |  | +---+ | |
            |  +-------+ |
            +------------+

Заявление от t, поэтому:

t is ...

Затем мы видим ;, поэтому продолжаем идти и видим *, поэтому

t - указатель на ...

Тогда мы видим &

t - указатель на ссылку на ...

Здесь мы сразу столкнемся с проблемой. Вы не можете иметь указатель на ссылку. У ссылок нет адресов.

2 голосов
/ 23 марта 2019

Типы C ++ ориентированы на имена. int*&foo это то, как вы должны думать об этом.

Во-первых, у нас есть &foo - foo - ссылка. Ссылка на что? *&foo - указатель. Указатель на что? int*&foo целое число.

Оригинальные правила типа C, в которых даже предполагается "продемонстрировать, как они используются". Таким образом, int *foo - это сокращение для int = *foo, являющегося допустимым выражением, или *foo создает int. & не совсем так работает.

1 голос
/ 23 марта 2019

Поскольку int&* на самом деле не имеет смысла, учитывая, что означает запись.

  • int: тип данных
  • x *: указатель на данныетип x
  • x &: ссылка на тип данных x

Мы можем объединить их в следующих общих формах:

  • int *: указатель на int
  • int &: указатель на int

Я сделаю паузу, чтобы сказать, что, надеюсь, вы знаете разницу между прохождениемссылка и указатель .Если нет, см. Ссылку.

Однако у нас есть другая комбинация, которую мы можем попробовать:

  • int *&: ссылка на указатель на int.

Мы можем использовать int *& следующим образом: в вызывающей стороне:

int * myInt= 0;
myfunction(myInt);

в myFunction (int * & myInt):

int i;
myInt = &i; 

myInt int в вызывающейбыть адресом i

ПРИМЕЧАНИЕ: установка myInt на адрес локальной переменной не очень хорошая идея, так как по истечении минуты myFunction() сохраненные там данные будут уничтожены.Это только для примера

Наконец, есть под рукой вопрос: int&*

  • int &*: указатель на ссылку на int

Теперь я предлагаю вам вопрос: если у нас есть ссылка на int, зачем нам указатель?Ответ: мы не делаем.Это не имеет смысла.

Итак, вкратце: int*& и int&* - это две разные вещи.Первый имеет смысл, если вы сломаете его, второй нет.

...