嵌入式编程]指针与多维数组

如何理解嵌入式LCD控制器编程中的下面这段程序:
在开发板所带的测试程序中的 lcdlib.c 中有这么一句:
frameBuffer256=(unsigned int (*)[SCR_XSIZE/4])malloc(ARRAY_SIZE_COLOR);
请问这种写法表示什么意思?语法上怎么了解?在Glib.c中 frameBuffer256 应该是一个二维数组,而在lcdlib.c中定义为一个一维数组。在这之前已定义了:
#define ARRAY_SIZE_COLOR  (SCR_XSIZE/1*SCR_YSIZE)
unsigned int (*frameBuffer256)[SCR_XSIZE/4]; 
实用C语言详解 上的解释
指针与多维数组
    由于一个n维数组实际上就是n—l维致组的一维数,而一维数组可以很方便地用指针方式访问或
用指针动态建立因此n维效组也可以象一维数组一样用指针方式访问或用指针动态建立。例如,若arr
时是一个二维数组则可以用arr[i][j]来访问该效组的i行j列。由于array[i]是该数组i行头一个元素
array[i][0]的地址.而array是该数组头一行的地址.故array[i]也可表示为*(array十i)(同样,&array[i]可表示为(array+i)。从而array[i][j]就可表示为(*(array+i))[j],而后者又可看作是对一维数组元素的引用,故可进一步表示为*((*(array十i))十j),即。*(*(array+i)+j)。另一方面array[i][j]可改写为(array[i])[j],即如果把array[i]看作是一维数组的名字,则array[i][j]可当作对该一维效组第j个元素的引用,从这个角度,array[i][j]又可表示为,*(array[i]+j),而array[i]可表示为*(array+i),故*(array[i]十j)也可扩展为*(*(array+i)+j)。从而.如下四个表达式是等价的,
    array[i][j]
    (*(array+i))[j]
    *(array[i]+j)
    *(*(array+i)+j)
    如果ptr是一个指向一维数组的指针,这个一维数组类型的大小与array第二维的大小相同并且具
有相同的数据类型,比如array与ptr可以分别是通过如下说明:
    double array[10][100]
    double (*ptr)[100]
并且ptr指向array[0],那么也可以用如下表达式来访问array[i][j]
    ptr[i][j]
    (*(ptr+i))[j]
    *(ptr[i]+j)
    *(*ptr+i)+j)
但是如果指针ptr值向类型不是上述一维数组类型,而是array的元素类型double,并且ptr指向array[
0][0].那么就不能用上面四个表达式中的任一个来访问array[i][j](这时它们都是非法的),而只能
使用如下两个表达式之一:
    ptr[i*100+j]
    *(ptr+(i*100+j))
显然,这样访问比较麻烦。
    多维数组也可以用指针通过库函数malloc动态建立,建立动态分配多维数组的方法与建立动态分配一维数组的方法类似。例如,如果要建立一个与数组说明
    data_type array[N1][N2]......[Nn];
所建立的数组同样规格的n维动态数组那么可以先说明一个指向n-1维数组的指针变量:
    data_type (*ptr)[N2][N3]......[Nn];
(注意ptr所指向n-1维数组中的各个下标的大小与array数组中那些下标相对应)然后再用malloc函数为这个动态分配n维数组分配内存。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章