Преобразование массивов в указатели в C прописано в разделе 6.3.2.1p3 стандарта C :
За исключением случаев, когда он является операндом sizeof
оператор, оператор _Alignof
или унарный оператор &
, или строковый литерал, используемый для инициализации массива, выражение с типом «массив типа» преобразуется в выражение с типом «указатель на тип»это указывает на начальный элемент объекта массива и не является lvalue.Если объект массива имеет класс хранения регистров, поведение не определено.
Это означает, что массив немедленно преобразуется в указатель везде, где он используется за исключением для трех перечисленных случаев.выше.
Таким образом, применение выше к (int*)data
, data
является операндом оператора typecast.Поскольку этот оператор не является одним из перечисленных выше, data
в этом выражении преобразуется из char [12]
в char *
, затем приведение преобразует char *
в int *
.
.как упоминалось выше, массив не преобразуется при передаче в sizeof
.Это означает, что sizeof(data)
соответствует размеру char [12]
, равному 12.