Подтвердить что ты не робот

Декларация типа - указатель Asterisk Position

в С++, следующее означает "выделить память для указателя int":

int* number;

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

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

int* number1, number2;
4b9b3361

Ответ 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;