За исключением случаев, когда он является операндом операторов sizeof
или унарных &
или является строковым литералом, используемым для инициализации массива символов в объявлении, N-элемент выражение типа "N"массив T
"преобразуется (" распадается ") в выражение типа" указатель на T
", а значением выражения является адрес первого элемента массива.
Когда выcall
met1(b);
выражение b
преобразуется из типа "массив из 1 элемента int
" в тип "указатель на int
" и значениевыражение - это адрес b[0]
.
В прототипе функции
void met1(int a[1])
объявление параметра int a[1]
"скорректировано" до int *a
- оно фактически объявляется как указатель(что удобно, поскольку именно это и получает функция).
Поэтому, когда met2
вызывает met1
, он передает адрес первого элемента b
. Оператор []
может бытьиспользуется для указателей, а также массивов (это на самом деле определяется в тошибки арифметики указателя - a[i]
интерпретируется как *(a + i)
).
Таким образом, запись a[0] = 199;
в met1
эквивалентна записи b[0] = 199;
в met2
.