今天,看了一下彩屏的驱动程序,在显示字符的时候看到一段这样的代码,在江西理工大学朱兆琪的帮助下,才意识到自己以前对数组指针的一个极大的误区,下面总结一下吧!
1、首先是声明变量
unsigned char *pFont; unsigned char *FontTable[] = { (unsigned char *)FONT6x8, (unsigned char *)FONT8x8, (unsigned char *)FONT8x16 };2、然后就是这样一段代码
pFont = (unsigned char *)FontTable[size];//pFont = FONT8x8,意思就是pFont = FONT8x8 // get the nColumns, nRows and nBytes nCols = *pFont; //获取首元素的列大小 nRows = *(pFont + 1); //获取首元素的行大小 nBytes = *(pFont + 2); //获取首元素的大小
const unsigned char FONT8x16[][16] = { 0x08,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // columns, rows, num_bytes_per_char 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20
接下来就是分析我的代码了
1、这里nCols = 0x08 nRows = 0x10 nBytes = 0x10 没错打印的就是数组FONT8X16的前三个元素
2、之前理解错误的就是觉得应该打印的是3个元素的地址。
3、首先FONT8X16是一个二维数组,它指向的是一个数组的首元素的地址,只不过这个首元素是一个数组
4、然后(unsigned char *)FONT8x16表示把首元素的地址转化为一个字符型指针
5、接着 pFont = (unsigned char *)FontTable[size] 就是取这个字符型指针里面的值,也就是得到了指针指向的二维数组的首元素(也就是一个数组),这还是一个地址!
6、最后 *pFont就是取得 二维数组首个元素(第一个一维数组)的首元素,也就是0x08,*(pFont+1)第二个元素0x10
7、那么假如我们 *FONT8X16又表示的是什么呢?这是表示取得二维数组首元素的地址,*(FONT8X16+1)表示第二个元素的地址
更形象的一个例子如下!
#include<stdio.h> int main() { int m,n =0; int a[][8] = {1,1,2,4,5,6,7,8,9}; int *p = (int *)a; n = *(a+8); m = *(p+8); printf("%d\n%d\n",n,m); }