Описание типа - положение звездочки указателя

в C++ следующее означает, "выделяют память для международного указателя":

int* number;

Так, звездочка является частью типа переменной; без него, который означал бы, "выделяют память для интервала".

Затем разве это не имело бы большего смысла, если следующие, предназначенные ", выделяют память для двух международных указателей"?

int* number1, number2;
32
задан Feyyaz 6 December 2017 в 23:07
поделиться

5 ответов

Страуструпа спросили об этом, и он сказал (перефразируя)

  • , если вы думаете, что больше C-ish, вы скажете int * a и Employee * pE (значит, вы думаете, что «содержание a является целым числом»)
  • , если вы больше думаете о C ++ - иш вы скажете int * a и Employee * pE (так что в вашей голове это « a является целочисленным указателем»)

Вы можете думать как хотите, если вы никогда не объявляете два указателя в одной строке.

У меня работает. Я человек типа Сотрудник * pE , но я женат на человеке типа Сотрудник * pE - я бы посоветовал не слишком волноваться по этому поводу.

59
ответ дан 27 November 2019 в 19:50
поделиться

Вы чрезмерно упрощаете структуру объявления 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;

(хотя в то же время я предпочитаю группировать * по имени, а не по типу).

18
ответ дан 27 November 2019 в 19:50
поделиться

Это лишь одна из многих нестыковок синтаксиса объявления C. Модификатор типа * является частью типа, но синтаксически он принадлежит объявленному идентификатору.
То же самое верно для и и [], кстати.

См. здесь , чтобы узнать, что * делает помимо изменения типа.

8
ответ дан 27 November 2019 в 19:50
поделиться

На самом деле звездочка прикреплена к переменной (соглашение, унаследованное от 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;
22
ответ дан 27 November 2019 в 19:50
поделиться

Нет,

int* number1, number2;

Объявляет number1 как указатель на int и number2 как ] int . Лично я также предпочитаю прикреплять звездочку к типу, который страдает именно той ошибкой, которую вы поднимаете в этом вопросе, поэтому я бы объявил два указателя следующим образом:

int* number1;
int* number2;
3
ответ дан 27 November 2019 в 19:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: