gzyueqian
13352868059

嵌入式培训班讲师关于C语言数组与指针的讲解

更新时间: 2019-01-05 14:33:47来源: 粤嵌教育浏览量:4648

  在嵌入式培训班C语言实训过程中,我发现,讲数组学生们很容易理解,但是一旦涉及到指针,学生们开始懵了。对于他们来说,指针很难,这是因为很多学生没有系统的学习过C语言,或者说他们上C语言的时候没有很好的学习。

  反而嵌入式培训班C语言到了讲数组,学生们却运用的很溜,针对于这种情况,我改变了我实训的方式,凡是涉及到指针方面的问题,尽量用数组的写法表达出来,同时也给学生们分析一下指针与数组的联系和区别。其中重点表示在开发板的LCD屏幕上显示图片这一块。

  对于数组来说,数组名是数组首元素的地址,也就是说数组名存储的是数组的首元素地址,那么在C语言里面什么类型的变量是用来保存地址的呢?答案是指针。既然如此,那么使用一个类型对应的指针变量来保存数组的首元素地址,是不是这个指针变量也可以使用数组表示数组元素的写法来描述数组的元素?经过测试,确实是可以的,而且指针更加灵活,因为数组名虽然存储的是数组首元素的地址,但是它不能被重新赋值,这是因为数组一旦确定大小,在内存中申请到空间后是固定的,但是指针变量没有这种限制。所以,但使用mmap函数对屏幕进行映射的时候,通常是先给学生讲解二维数组的概念,如何使用二维数组和write函数对LCD屏幕进行操作,以及指针与数组写法的联系,然后将mmap函数映射出来的地址保存到一个数组指针里面去,就可以在显示的时候使用二维数组的写法来实现。

  以下是代码示例:

  #include <stdio.h>

  #include <unistd.h>

  #include <sys/types.h>

  #include <sys/stat.h>

  #include <fcntl.h>

  #include <sys/mman.h>

  int lcd_fd;

  int (*fbp)[800];

  int show_bmp(char * bmp_pathname)

  {

  int bmp_fd;

  char bmp_buf[800*480*3] = {0};

  int tmp_buf[800*480] = {0};

  int i,j,x,y;

  //打开图片

  bmp_fd = open(bmp_pathname,O_RDWR);

  if(bmp_fd == -1)

  {

  perror("open bmp ");

  return -1;

  }

  //跳过图片54个字节的头信息

  lseek(bmp_fd,54,SEEK_SET);

  //读取像素数据

  read(bmp_fd,bmp_buf,800*480*3);

  //调整像素数据

  for(i=0;i<800*480;i++)

  {

  tmp_buf[i] = bmp_buf[0+i*3] | bmp_buf[1+i*3]<<8 | bmp_buf[2+i*3]<<16 | 0x00<<24;

  }

  //像素位置调整并显示到屏幕上面去

  for(y=0;y<480;y++)

      {

  for(x=0;x<800;x++)

          {

  fbp[y][x] = tmp_buf[(479-y)*800+x];

          }

      }

  close(bmp_fd);

  return 0;

  }

  int main()

  {

  //打开LCD

  lcd_fd = open("/dev/fb0",O_RDWR);

  if(lcd_fd == -1)

  {

  perror("open lcd");

  return -1;

  }

  //映射屏幕

  fbp = (int (*)[800])mmap(0,800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,lcd_fd,0);

  if(fbp == MAP_FAILED)

  {

  perror("mmap fail");

  return -1;

  }

  show_bmp("0.bmp");

  close(lcd_fd);

  return 0;

  }

     嵌入式培训班C语言中有关数组和指针的内容,现在同学们都理解了吗?如果还有不懂的地方,欢迎来粤嵌进一步学习。


免费预约试听课