现在的位置: 首页 > 综合 > 正文

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

2013年01月10日 ⁄ 综合 ⁄ 共 1218字 ⁄ 字号 评论关闭

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

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_char
0x00,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);
}

有机会还来回味回味

抱歉!评论已关闭.