关于C语言的二维数组和指针注意的地方

来源:互联网 发布:网络微电影排行榜 编辑:程序博客网 时间:2024/05/02 03:10

今天,看了一下彩屏的驱动程序,在显示字符的时候看到一段这样的代码,在江西理工大学朱兆琪的帮助下,才意识到自己以前对数组指针的一个极大的误区,下面总结一下吧!

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);//获取首元素的大小

3、还有就是这个数组也贴出来

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_char0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // space 0x20

注意:SIZE取2

接下来就是分析我的代码了

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);}

有机会还来回味回味

原创粉丝点击