二维数组在C语言中,如果是使用int a[2][2]={{1,2},{5,4}} 之类的初始化的,其实在内存中也是一段连续的内存,只是在使用上区别,因为c语言需要知道你操作的是一个二维数组。
关于二维数组的在函数中传参使用,其实主要是指针类型 的声明
int *p[2]; 在c中定义一个这样的指针,他表示的是指针数组,因为标准c中默认[]优先级高于*。p先和[]结合,表明它是一个数组,数组元素类型是int*、
int (*p)[2].因为有() 优先级高于[],所以p和*先结合,此时p表示一个指针,其类型是指向一个int (*)[2]。(*对已一个int a[2]数组,对其数组名直接引用,a是一个int*类型,而通过&a取地址符引用,他表示一个int (*)[2]类型,也就是表示指向数组的指针。直接对数组名引用,是一个指向数组首元素的int*类型。)
对于二维数组,如int a[2][3],a数组名,在codeblocks下使用gcc编译器,会认为是int (*)[3] 类型。表示指向的是一个int (*)[3]数组。正好等同于二维数组定义【二维数组,就是数组中的元素是一个一维数组,作这个理解,比较容易操作2维数组】。而a[0]则表示int*类型。同上,对&a取地址操作,得到的是int (*)[2][3]指针类型。而对&a[0]取地址操作,得到的是int (*)[3] 指针类型。
看下面的代码,一般通过int [2][3]等类型初始化的数组,可以使用int (*)[3] 的类型参数作为函数形参。直接使用int a[2][3]作为形参也是可以的。