定义指向数组的指针只需要声明一个普通的指针int *p,在函数中作为形参可以直接使用int p[]?

代替int*p,为什么定义指向二维数组的指针需要在后面加上[3]也就是int (*p)[3],在函数中也不能省略最后面的3也就是int[][3]?

对于形参int p[][3]实际上等同于int (*p)[3],都是将p定义成了一个指向数组的指针,就是说p可以指向一个具有3个int型元素的数组。

可以像这样使用:
void f(int p[][3])
{}
int arr1[3];
int arr2[2][3];
//以下两种调用方式都对
f(&arr1);
f(arr2);

那为什么int p[][3](或int (*p)[3])必须写上一个数字呢?因为指向数组的指针的移动是以数组为单位的,p++,p+=1都是移动一个数组的内存大小,如果是3,就移动3*sizeof(int)个字节,而p+=2就是移动两个数组的内存大小。

可以将int (*p)[3]理解成int[3] *p;即p的移动是以int[3]为单位的。从这就可以看出数字3是必须的,不能省略,否则就无法计算出移动的单位是多少字节。而int *p(或int p[])之所以可以省略[]中的数字,是因为移动单位就是sizeof(int),计算时不依赖[]中的数字。
温馨提示:答案为网友推荐,仅供参考
相似回答