исключения случаев, когда это операнд sizeof
, _Alignof
или одинарных &
операторов, или является строкой символов используются для инициализации другого массива в объявлении, выражения типа «N-элемент массив T
» будет преобразован в выражение типа «указатель на T
», а значение выражения будет адресом первого элемента в массиве.
В вызове функции
fun(arr);
тип выражения arr
является "3-элемент массива из 4-элемента массива int
". Так как arr
не является операндом операторов sizeof
, _Alignof
или унарных &
, он преобразуется в выражение типа «указатель на 4-элементный массив int
», который записывается как int (*arr)[4]
, а его значением будет адрес от a[0]
.
Постфиксные операторы, такие как []
и ()
имеют более высокий приоритет, чем унарные операторы, как *
, так *a[N]
является N
-элементного массив указателей, в то время как (*a)[N]
является указатель на N
-элементный массив. Аналогично, *f()
- это функция, возвращающая указатель, а (*f)()
- указатель на функцию.
Измените свой код, это не C или C++! –
'int arr [3] [4]' будет вырождаться в 'int *', а не 'int **'! –
Один из них принимает массив указателей 'int' (размер теряется во время распада), а другой - указатель на массив' int' из четырех значений. Они совсем разные звери. – WhozCraig