Последовательность ссылочного типа указателя

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

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

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

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

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

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

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

Читать справа налево: int*& — это ссылка на указатель на int. int&* будет указателем на ссылку на int (что недопустимо и объясняется здесь: stackoverflow.com/questions/4632762/…)

UnholySheep 23.03.2019 21:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
131
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

Первоначальные правила типа C даже предназначались для «демонстрации того, как они используются». Таким образом, int *foo — это сокращение от int = *foo, являющееся допустимым выражением, или *foo образует int. & работает не совсем так.

О~ спасибо!! Я полностью понимаю! я просто не умел правильно читать

TYFA 23.03.2019 21:19

Опечатка: "как вы должны думать" должно быть "как вы должны думать".

user10957435 23.03.2019 21:31

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

There are three simple steps to follow:

  1. Starting with the unknown element, move in a spiral/clockwise direction; when ecountering the following elements replace them with the corresponding english statements: [X] or [] => Array X size of... or Array undefined size of... (type1, type2) => function passing type1 and type2 returning... * => pointer(s) to...
  2. Keep doing this in a spiral/clockwise direction until all tokens have been covered.
  3. Always resolve anything in parenthesis first!
               +---------+  
               | +-----+ |
               | | +-+ | |
               | | ^ | | |
           int * & t ; | |
            ^  ^ ^   | | |
            |  | +---+ | |
            |  +-------+ |
            +------------+

Исходя из t, так что:

т это...

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

т это отсылка к...

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

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

Затем мы видим int:

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

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

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

Исходя из t, так что:

т это...

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

т это указатель на...

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

t является указателем на ссылку на...

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

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

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

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

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

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

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

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

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

int * myInt= 0;
myfunction(myInt);

в моей функции (int * & myInt):

int i;
myInt = &i; 

myInt int в звонилке будет адресом i

NOTE: setting myInt to the address of a local variable is not a good idea, as the minute myFunction() ends, the data stored there will be destroyed. This is just for example purposes only

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

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

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

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

Другие вопросы по теме