Декларация типа - указатель Asterisk Position
в С++, следующее означает "выделить память для указателя int":
int* number;
Итак, звездочка является частью типа переменной; без него это означало бы "выделить память для int".
Тогда не было бы более разумным, если бы следующее означало "выделить память для двух указателей на int"?
int* number1, number2;
Ответы
Ответ 1
Страуструпа спросили об этом, и он сказал (перефразируя)
- Если вы думаете больше C-ish, вы скажете int * a и Сотрудник * pE(так что в голове вы думаете: "содержание a - целое число)
- если вы думаете, что больше С++ - ish, вы скажете int * a и Сотрудник * pE(так что в вашей голове это" a является целым указателем")
Вы можете думать, как вам нравится, если вы никогда не объявляете два Понтеры в одной строке.
Работает для меня. Я человек Employee* pE
, но я женат на человеке Employee *pE
- мой совет был бы не слишком усердным.
Ответ 2
На самом деле звездочка привязана к переменной (соглашение, унаследованное от C), поэтому
int * number1, number2;
объявляет number1
как указатель на int
(т.е. *number1
является int
) и number2
как int
.
Интервал не влияет на то, как набирается number
. Он просто служит разделителем токенов. Все следующие для компилятора одинаковы, поскольку пробелы будут удалены после разбора.
int *a;
int*a;
int* a;
int * a;
int/**a***/*/*a***/a;
Используйте
int* number1, *number2;
чтобы создать два указателя или даже лучше, разделите его на несколько объявлений, чтобы избежать путаницы.
int* number1;
int* number2;
Ответ 3
Вы упрощаете структуру объявления С++ (хотя точки, которые вы делаете, совершенно логичны). Только с первого взгляда может показаться, что объявление С++ состоит из имени типа и последовательности имен сущностей, разделенных запятыми, но в действительности в С++ (а также в C) декларация фактически состоит из имени типа и последовательности деклараторов. Полная информация о типе для объекта, который вы объявляете, разделяется между двумя отдельными местоположениями, а часть его фактически является частью его декларатора. Это так, как на С++. Чтобы лучше отразить фактическую структуру декларации (как видно на языке), может быть хорошей идеей форматировать объявления как
int *a, *b;
то есть. явно group *
с именами сущностей, а не с именем типа. (Но, в конце концов, это вопрос личных предпочтений.)
Что касается того, почему он разработан таким образом на языке, как вы просите в одном из комментариев... Как вы знаете, части синтаксиса объявления, описывающие тип объявляемого объекта, могут отображаться на левую сторону имени (например, *
и &
), а также его правую часть (например, ()
и []
), как в
int *f(), (&g)[5], h[2][2];
Для битов, которые появляются справа, просто невозможно сделать это каким-либо другим способом. У них нет выбора, кроме как сгруппировать его с именем объекта, а не с именем типа. Можно спросить, почему вышеуказанные объявления не выполняются на С++ в качестве
int *() f;
int (&)[5] g;
int [2][2] h;
(т.е. все связанные с типом появляются в левой части в компактной группе)... Ну, ответ на этот вопрос заключается в том, что так оно и есть на С++. Этот подход наследуется от C и там "объявление должно напоминать использование" часто цитируется как обоснование.
P.S. Еще одна вещь, которую нужно помнить (и то, что часто интерпретируется неправильно) заключается в том, что квалификаторы, смежные с именем типа в объявлении, являются частью общего типа, а не частью первого индивидуального декларатора. Например
int const *a, *b;
объявляет const int *a
и const int *b
, а не int *b
, как некоторые могут ошибочно полагать. По этой причине я лично предпочитаю использовать более логичный
const int *a, *b;
(хотя в то же время я предпочитаю группировать *
с именем, а не с типом).
Ответ 4
Это лишь одна из многих неравномерностей синтаксиса объявления C. Модификатор типа *
является частью типа, но синтаксически он принадлежит объявленному идентификатору.
То же самое верно для &
и []
, BTW.
Смотрите здесь, для чего *
делает, кроме изменения типа.
Ответ 5
Нет,
int* number1, number2;
Объявляет number1
как указатель на int
и number2
как int
. Лично я также предпочитаю прикреплять звездочку к типу, который страдает от именно того, что вы получили в этом вопросе, поэтому я бы назвал два указателя следующим образом:
int* number1;
int* number2;