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