1. 程式人生 > >嵌入式培訓班講師關於C語言陣列與指標的講解

嵌入式培訓班講師關於C語言陣列與指標的講解

  在嵌入式培訓班C語言實訓過程中,我發現,講陣列學生們很容易理解,但是一旦涉及到指標,學生們開始懵了。對於他們來說,指標很難,這是因為很多學生沒有系統的學習過C語言,或者說他們上C語言的時候沒有很好的學習。

  反而嵌入式培訓班C語言到了講陣列,學生們卻運用的很溜,針對於這種情況,我改變了我實訓的方式,凡是涉及到指標方面的問題,儘量用陣列的寫法表達出來,同時也給學生們分析一下指標與陣列的聯絡和區別。其中重點表示在開發板的LCD螢幕上顯示圖片這一塊。


嵌入式培訓班C語言


  對於陣列來說,陣列名是陣列首元素的地址,也就是說陣列名儲存的是陣列的首元素地址,那麼在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;

  }