LINUX.ORG.RU

История изменений

Исправление xaizek, (текущая версия) :

Можно по-подробнее, каким образом он разлагается при *(p6 + 3). Будет ли он разлагаться, если вместо 3 будет переменная?

typeof(   p6 + 3  ) == int64_t(*)[6]
typeof( *(p6 + 3) ) == int64_t[6]

Разложение (int64_t[6] => int64_t*) происходит при использовании выражения *(p6 + 3) где-нибудь. С массивами работают как с указателями всегда, поэтому это происходит автоматически.

Это как функции разлагаются до их адреса. Не удивляет же, что *&main не равно куску кода, а всегда возвращает адрес? Или скажем строковые литералы ведут себя либо как список инициализации (при инициализации) либо как массивы/указатели в других выражениях.

Грубо говоря, массивы не являются first-class citizens и поэтому для работы с ними их тип меняется автоматически. Структуры, например, являются и если обернуть массив в структуру, то он будет копироваться в аргументах и возвращаемом значении и его можно будет даже присваивать.

Будет ли он разлагаться, если вместо 3 будет переменная?

Будет, речь идёт преобразованиях системы типов, конкретные элементы значения не имеют.

Исправление xaizek, :

Можно по-подробнее, каким образом он разлагается при *(p6 + 3). Будет ли он разлагаться, если вместо 3 будет переменная?

typeof(   p6 + 3  ) == int64_t(*)[6]
typeof( *(p6 + 3) ) == int64_t[6]

Разложение (int64_t[6] => int64_t*)происходит при использовании выражения *(p6 + 3) где-нибудь. С массивами работают как с указателями всегда, поэтому это происходит автоматически.

Это как функции разлагаются до их адреса. Не удивляет же, что *&main не равно куску кода, а всегда возвращает адрес? Или скажем строковые литералы ведут себя либо как список инициализации (при инициализации) либо как массивы/указатели в других выражениях.

Грубо говоря, массивы не являются first-class citizens и поэтому для работы с ними их тип меняется автоматически. Структуры, например, являются и если обернуть массив в структуру, то он будет копироваться в аргументах и возвращаемом значении и его можно будет даже присваивать.

Будет ли он разлагаться, если вместо 3 будет переменная?

Будет, речь идёт преобразованиях системы типов, конкретные элементы значения не имеют.

Исходная версия xaizek, :

Можно по-подробнее, каким образом он разлагается при *(p6 + 3). Будет ли он разлагаться, если вместо 3 будет переменная?

typeof(   p6 + 3  ) == int64_t(*)[6]
typeof( *(p6 + 3) ) == int64_t[6]

Разложение происходит при использовании выражения *(p6 + 3) где-нибудь. С массивами работают как с указателями всегда, поэтому это происходит автоматически.

Это как функции разлагаются до их адреса. Не удивляет же, что *&main не равно куску кода, а всегда возвращает адрес? Или скажем строковые литералы ведут себя либо как список инициализации (при инициализации) либо как массивы/указатели в других выражениях.

Грубо говоря, массивы не являются first-class citizens и поэтому для работы с ними их тип меняется автоматически. Структуры, например, являются и если обернуть массив в структуру, то он будет копироваться в аргументах и возвращаемом значении и его можно будет даже присваивать.

Будет ли он разлагаться, если вместо 3 будет переменная?

Будет, речь идёт преобразованиях системы типов, конкретные элементы значения не имеют.