Как передать переменную-указатель в качестве ссылочного параметра?
У меня есть дополнительный вопрос по этому вопросу.
Ответчик в вопросе использует int*& в качестве типа данных параметра, но я не понимаю последовательность указателя и типа данных ссылки.
На мой взгляд, int&* выглядит более практичным, поэтому я попытался скомпилировать его, но это было запрещено.
Я хочу ясно понять эту логику.
Я думал, что int*& a как int*(int& a), так что это как указатель ссылки, но, видимо, это было как раз наоборот.
Почему я не могу использовать int&* как значение ссылки на указатель?





Типы C++ ориентированы на имена. int*&foo вот как вы должны думать об этом.
Во-первых, у нас есть &foo -- foo это ссылка. Отсылка к чему? *&foo -- указатель. Указатель на что? int*&foo целое число.
Первоначальные правила типа C даже предназначались для «демонстрации того, как они используются». Таким образом, int *foo — это сокращение от int = *foo, являющееся допустимым выражением, или *foo образует int. & работает не совсем так.
О~ спасибо!! Я полностью понимаю! я просто не умел правильно читать
Опечатка: "как вы должны думать" должно быть "как вы должны думать".
По часовой стрелке/спиральное правило
There are three simple steps to follow:
- 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...
- Keep doing this in a spiral/clockwise direction until all tokens have been covered.
- Always resolve anything in parenthesis first!
+---------+
| +-----+ |
| | +-+ | |
| | ^ | | |
int * & t ; | |
^ ^ ^ | | |
| | +---+ | |
| +-------+ |
+------------+
Исходя из t, так что:
т это...
Затем мы видим ;, так что продолжайте идти и увидите &, так что
т это отсылка к...
Тогда мы видим *
t является ссылкой на указатель на...
Затем мы видим int:
t является ссылкой на указатель на int
Это имеет смысл. Теперь попробуем другой:
+---------+
| +-----+ |
| | +-+ | |
| | ^ | | |
int & * t ; | |
^ ^ ^ | | |
| | +---+ | |
| +-------+ |
+------------+
Исходя из t, так что:
т это...
Затем мы видим ;, так что продолжайте идти и увидите *, так что
т это указатель на...
Тогда мы видим &
t является указателем на ссылку на...
Тут мы сразу сталкиваемся с проблемой. У вас не может быть указателя на ссылку. Ссылки не имеют адресов.
Потому что int&* на самом деле не имеет смысла, учитывая, что означает обозначение.
int: тип данныхx *: указатель на тип данных xx &: ссылка на тип данных xМы можем комбинировать их в следующих общих формах:
int *: указатель на intint &: ссылка на 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&* — это разные вещи. Первое имеет смысл, если его разбить, второе — нет.
Читать справа налево:
int*&— это ссылка на указатель на int.int&*будет указателем на ссылку на int (что недопустимо и объясняется здесь: stackoverflow.com/questions/4632762/…)