Ну, тип был бы неправильным.
в вашем примере x
будет иметь значение int *
, указатель на первый элемент x
. &x
, с другой стороны, оценивается как int (*)[5]
, указатель на весь массив.
Сложно привести пример того, как это происходит на практике, поскольку массив начинается с первого элемента по определению . Но это все еще неправильно на уровне языка. Указатели не могут быть преобразованы неявно, за одним исключением void *
. Итак, во втором примере компилятор должен предупредить вас (если это не так, добавьте несколько флагов, например, для gcc
используйте -std=c11 -Wall -Wextra
- или получите лучший компилятор).
Если вместо этого вы напишите следующее:
int x[5] = {1};
int (*a)[5] = (int (*)[5])x;
это будет работать и должно компилироваться без предупреждений. Тем не менее, это не правильный способ сделать это. Хотя в этом конкретном случае приведение должно всегда работать должным образом, в общем случае следует избегать приведения указателей в C. Приведение указателя является потенциальной ошибкой, поэтому делайте это только тогда, когда это абсолютно необходимо, а затем дважды проверьте полученный код не нарушает строгое псевдонимы (посмотрите ...).
Здесь нет необходимости в приведении - напишите &x
и все в порядке.