История изменений
Исправление 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 будет переменная?
Будет, речь идёт преобразованиях системы типов, конкретные элементы значения не имеют.