第一题很好理解,我来说说第二题:
a int*p[3];
变量声明的时候后缀比前缀具有更强的约束力,所以p是一个int指针的数组。不应该选择。
b (int*) p[5];
这里的括号是一个强制类型转换,而不是变量声明。语义是把“p[5]”所指的内容强制转换成int指针。不应该选择。
c int(*p)[4] ;
变量声明的时候后缀比前缀具有更强的约束力,但括号改变了约束力的顺序。所以,它是一个int[4]数组类型的指针。
d int*p[];
解释跟“a”差不多。但需要注意的是,这个申明需要后面给出初始化列表。就如:char p[] = "abcd"。作为一个例子:
int *p = new int;
int*pv[] = {p, p};