理论上来说
*p = &a; 是不合法的,指针类型不同应该会报错或警告的。如果 &a 被强行转化为 struct st *,即p是struct st *类型,那么 C 和 D 都对;如果 &a 没有被强行转化为 struct st *,即p不是struct st *类型,而是struct st (*)[3]类型,那么 C 和 D 都错。&a是 (*)[3] 指针类型,该指针类型是不会有next,即 (&a)->next 是错的,但是 ((struct st*)&a)->next 可以,也就是指针类型不同,成员也不同。
所以这道题没意义