有本质区别,
int (*p)[4]:p的类型是指向一个数组的指针
int *p=a:p是一个指向整数的指针
初始化:
int (*p)[4] = &a;
要理解这个先要清楚指针的类型问题。内存地址保存在任何类型的指针中都是一个数值而已,但指针变量本身是有类型的,可能两个不同类型的指针变量的值是一样的。
假设 int *p = a; int (*q)[4] = &a; 这里p和q的值肯定是一样的,但是指针指向的类型不同,p指向的是int,而q指向的是int[4]。类型对于指针的影响是指针运算的偏移量:假设p是一个指针,类型是T,那么p+1的偏移量就是:p的地址值+sizeof(T)。所以上面的例子里,p+1偏移的是一个int的大小,而q+1偏移的是一个int[4]的大小,也就是4个int那么大。
一般情况下数组的指针多用于函数参数指向二维数组,例如
int sum(int (*a)[10]) {数组传递给函数后会退化为指针:
int a[10]; 保存int类型元素的数组,退化为指向int类型的指针
int b[20][10]; 二维数组其实是数组的数组,也就是保存类型为数组的数组,退化为指向数组类型(int[10]类型)的指针,也就是int (*p)[10];