嵌入式編程]指針與多維數組

如何理解嵌入式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維數組分配內存。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章