在做数据处理的时候,经常使用C语言的二维数组,比如传入汉字的字模等数据。不同于一维数组,一维数组作为函数参数时,只需要传入数组名即可。但是使用二维数组的数组名,作为传入函数的指针时有一些麻烦。
首先要明确一下二维数组的变量类型,以下面的例子为例,它的类型是 int (*)[10] ,即与数组名a等价的变量类型应该是“一个指向包含10个int元素的指针”。
int a[2][10] //数组名a的类型是int (*)[10]
注意这里等价的指针里需要包含二维数组的一个维度,所以传入函数的二维数组需要包含第2维的大小。起始这个也是可以理解的,因为二维数组在内存中是连续的,如果我们想通过二维数组的第一个维度去索引这个数组,那么肯定需要知道第2维度的大小,这样代码才知道变换不同的第一维的位置,需要挪动多少个字节。所以二维数组作为函数参数时,其函数的原型应该是下面这样的:
void display_word_page(uint8_t (*page)[16]) // page变量是一个二维数组
同样,作为强制类型转换的时候其类型应为
(uint8_t(*)[16])
在上面的方法中,二维数组的变量类型太长了,如果想简洁一些,可以对二维数组类型进行类型定义,例如
typedef char BUF[3][10]; //将char型的二维数组定义为BUF类型
void copy_ddram_buf(BUF src) //可以使用BUF这个类型作为函数的参数类型,注意BUF后面没有加'*'(星号)
{
// ...
}
这时,只需要传入二维数组的名字就行。注意作为函数参数的BUF类型变量并没有 * ,这时因为二维数组名本身就是指针了,不需要在取地址了。
二维数组的使用不同于一维数组。一维数组是占用一个连续的内存,在内存中像一条线一样,而二维数组则是将一条线分成了等长的多个段。因此为了在代码中对不同的分段进行访问,代码必须要知道分段的大小,因此作为参数的时候,必须指定其第2个维度的大小。