1

Объясните, пожалуйста, почему символ * при объявлении указателей должен стоять рядом с каждым идентификатором? Разве int* нельзя считать как "отдельный" тип?

Harry
  • 221,325
n 1 k z z z
  • 1,491
  • 6
  • 23
  • 4
    Нет такого типа -- int *. * это атрибут имени переменной, она говорит, что эта переменная указатель – avp Mar 30 '21 at 22:19
  • @avp, просто когда мы берем приведение типов, то можем увидеть такую конструкцию (int*)a и это очень похоже на отдельный тип – n 1 k z z z Mar 30 '21 at 22:35
  • 1
    Логично (но что еще, не обремененное множеством букв, можно было придумать? Вообще, imho любой нормальный для восприятия язык будет контекстнозависимым) – avp Mar 30 '21 at 22:39
  • 2
    У меня есть впечатление, что можно "у себя в голове" спокойно считать int* отдельным типом. И это, как мне кажется, ничему не будет мешать. Навскидку я не могу придумать примеров, когда такое "мысленное упрощение" не будет работать. ну, правда, при объявлении нескольких переменных в одном объявлении появляется "исключение из этого мысленного правила" – S.H. Mar 30 '21 at 22:51
  • @avp, а где можно почитать про эти самые атрибуты, просто в результатах поиска у меня такие. И там не совсем та информация которая мне нужна( – n 1 k z z z Mar 31 '21 at 00:17
  • 1
    int * - это отдельный тип, объявлять указатели следует по одному за раз. – user7860670 Mar 31 '21 at 06:55
  • 1
    Нет такого термина, "атрибут имени переменной". int * - это тип. – HolyBlackCat Mar 31 '21 at 07:01
  • @HolyBlackCat, насчет атрибута имени переменной. Я тут читал пункт Declarators в стандарте и там было написано: `ptr-operator:
    • attribute-specifier-seq opt cv-qualifier-seqopt

    & attribute-specifier-seq opt && attribute-specifier-seq opt, а по запросу про этот самыйattribute-specifier-seq` мне выдает это. И я что-то запутался что есть что.

    – n 1 k z z z Mar 31 '21 at 11:10
  • Или * не относится к этому attribute-specifier-seq? – n 1 k z z z Mar 31 '21 at 11:19
  • @n1kzzz Ссылка правильная. Эта запись означает, что справа от звездочки может стоять [[...]] (attribute-specifier-seq). Звездочка - не часть attribute-specifier-seq, конечно. Они же рядом написаны. Если бы звездочка была его частью, то она была бы написата тут. – HolyBlackCat Mar 31 '21 at 14:54

2 Answers2

3

Разве int* нельзя считать как "отдельный" тип?

Почему нельзя? Можно. Если сделать его типом. Например -

typedef int * pint;

pint a, b, c;

А иначе - как компилятору понять, что именно вы хотите в объявлении int * a, b;? Вот он и придерживается стандарта :)

Harry
  • 221,325
  • 1
    эх, недосмотрели разработчики си... было бы интересно, если int* a,b; - это два указателя. а int *a, b; - это указатель и число.... сколько бы новых вопросов было бы... – KoVadim Mar 31 '21 at 07:06
  • 1
    @KoVadim Да-да, а еще отступы чтобы имели значение... И сразу популярность языка взлетит до небес :) – Harry Mar 31 '21 at 08:26
  • 1
    не нужно мне тут питоном обмазывать. – KoVadim Mar 31 '21 at 08:26
3

почему символ * при объявлении указателей должен стоять рядом с каждым идентификатором

Потому что грамматику такую сделали. ¯\_(ツ)_/¯

Объявления имеют вид (упрощенно):

decl-specifier-seq declarator, declarator, ..., declarator

Один декларатор создает одну переменную. В центре него - имя переменной, а вокруг имени могут (но не обязаны) быть *, &, [...], (...) и т. д.

Все остальное попадает в decl-specifier-seq (в вашем случае это int).

Тип каждой переменной определяется по общему для всех переменных decl-specifier-seq, и плюс по информации из декларатора этой конкретной переменной.

Например в int *a, b;:

  • decl-specifier-seq - это int
  • *a - первый декларатор
  • b - второй декларатор

Так что *, как часть декларатора, влияет только на свой декларатор. А int, как часть decl-specifier-seq, влияет на обе переменные.

HolyBlackCat
  • 27,445
  • 3
  • 27
  • 40
  • А есть ли свое название у этих символов, которые объявляют массив или указатель и т. д. Допустим про имя переменной мы модем сказать что это идентификатор, а как тогда правильно назвать эту часть декларатора? – n 1 k z z z Mar 31 '21 at 07:21
  • @n1kzzz Почитал первую ссылку из ответа, и вижу, что *, &, &&, и Класс::* называются ptr-operator. Но это настолько хитрое название, что если вы кому-то их так назовете, вас не поймут. [...], судя по той же ссылке, никак не называются. – HolyBlackCat Mar 31 '21 at 14:57