1、声明N维数组的指针时,除了第一维大小可以留空外,其它都需要填写数值。例如
int fun(int arr[][2][5][3],int rows); 或者
int fun(int (*arr)[2][5][3],int rows);
如果不需要用到第一维大小,rows可以不要,但如果要知道整个数组大小,就必须把rows作为参数传给函数,或者使用全局变量记录第一维大小。
当然,也可以不传递第一维大小,而传递整个数组大小,这样同样可以算出第一维大小。总之,第一维大小必须是可知的。而不能通过被调用程序自己去获得。
编译器实际处理多维数组是把一维数组分段处理的,也就是说实际上并不存在多维数组,多维数组仅仅是个逻辑概念,所以行下标改变时,编译器必须知道有多少列,以计算偏移地址
例如:
void show(int *node,int num)
{
int i;
for(i=0;i<num;i++)
}
int main(void)
{
}
输出1 2 3 4 5 6
说明:
1)这个函数传递的就是整个数组元素多少,而不是第一维大小;
2)主函数里面使用arr做实参,由于数组名表示首元素的地址,所以,arr=&arr[0],因此它是一个指向二维int型数组的指针,与子函数类型不符合,函数运行时,其实是进行了类型转换,将其转换为int型指针。
如果使用show(*arr,6);就不需要进行类型转换。
3)区别变长数组做形参
此时,不能写成
参数必须放在数组前面。
更多维则
或者
2、不能用多重指针来表示多维数组;例如
上述子函数不能写成
void show(int **node,int num)
{
}