Если вы визуальный мыслитель, это может помочь представить звездочку в виде черной дыры , ведущей к значению данных. Следовательно, это указатель.
Амперсанд - это противоположный конец дыры, представьте себе распутанную звездочку или космический корабль, колеблющийся в хаотичном курсе, когда пилот преодолевает переход, выходящий из черной дыры.
Я помню, что был очень смущен тем, что C ++ перегружал значение амперсанда, чтобы дать нам ссылки. В своей отчаянной попытке избежать использования дополнительных символов, что было оправдано международной аудиторией, использующей C и известными проблемами с ограничениями клавиатуры, они добавили основной источник путаницы.
Одна вещь, которая может помочь в C ++, это думать о ссылках как о предварительно подготовленных разыменованных указателях . Вместо использования & someVariable при передаче аргумента вы уже использовали конечный амперсанд при определении someVariable. Опять же, это может еще больше сбить вас с толку!
Одной из моих ненавистей к домашним животным, которую я был недоволен, когда ее обнародовали в примерах Apple Objective-C, является стиль макета int *someIntPointer
вместо int* someIntPointer
ИМХО, сохранение звездочки с переменной является старомодным подходом C, подчеркивающим механику того, как вы определяете переменную, над ее типом данных.
Тип данных someIntPointer
является буквально указателем на целое число, и объявление должно отражать это. Это приводит к требованию, чтобы вы объявляли одну переменную на строку, чтобы избежать тонких ошибок, таких как:
int* a, b; // b is a straight int, was that our intention?
int *a, *b; // old-style C declaring two pointers
int* a;
int* b; // b is another pointer to an int
В то время как люди утверждают, что способность объявлять смешанные указатели и значения в одной строке, намеренно, является мощной функцией, я видел, что это приводит к тонким ошибкам и путанице.