Оператор A - это объявление
int (*p)[2];
^ <b>p is</b>
int (*p)[2];
^ p is <b>a pointer</b>
int (*p)[2];
^ p is a pointer <b>to an array</b>
int (*p)[2];
^ p is a pointer to an array <b>of 2</b>
int (*p)[2];
^^^ p is a pointer to an array of 2 <b>int</b>
Оператор B - это выражение присваивания со встроенным приведением
pint=(int*)p;
^ <b>take the value in p (of type "pointer to array of 2 ints")</b>
pint=(int*)p;
^^^^^^ take the value in p, <b>convert it to 'pointer to int'
even if it doesn't make sense to do so</b>
pint=(int*)p;
^^^^^ take the value in p, convert it to 'pointer to int'
<b>and put the resulting value (whatever that may be) in pint</b>
Приведение неверно.Избегайте приведений как можно больше.
(*), за исключением особых случаев, таких как <ctype.h>
, или функции с переменным числом, или ...