请高手赐教C语言图片文件头文件格式的解释,该怎么处理

请高手赐教C语言图片文件头文件格式的解释
FILE   *fp;
unsigned   char   *pRGB,*pr,*pg,*pb,*pR,*pG,*pB;
int   j,i;
unsigned   int   *pk;

pRGB=(unsigned   char   *)headerImage;//为unsigned   char   headerImage[54]
for   (   i=0;i <54;i++,pRGB++   ) (*pRGB)=0;
pRGB=(unsigned   char   *)headerImage;
(*pRGB)=0x42;   pRGB++; //   BM
(*pRGB)=0x4d;   pRGB++;
pRGB+=2;
pk=(unsigned   int   *)pRGB;   (*pk)=14+40+180*144*3; //   size
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=0; //   reserved
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=54; //   image   offset
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=40; //   struct   size
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=720; //   width
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=576; //   height
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=0x180001; //   Planes   &   BitCount
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=0; //   Compression
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=720*576*3; //   image   size
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=3780; //   x   pixels/m
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=3780; //   y   pixels/m
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=0; //   color   used
pRGB+=4;
pk=(unsigned   int   *)pRGB;   (*pk)=0; //   important   color
if   (   fp=fopen( "video.bmp ", "wb+ ")   )
{
printf( "Create   a   file   named   Video.bmp\n ");
pRGB=headerImage;/***************************/
fwrite(pRGB,2,1,fp);/***************************/
fwrite(pRGB+4,52,1,fp);/***************************/
pR=m_dbTargetImageR+720*575;
pG=m_dbTargetImageG+720*575;
pB=m_dbTargetImageB+720*575;
printf( "Saving   image   data...\n ");
for   (   j=0;j <576;j++   )
{
pr=pR;   pg=pG;   pb=pB;
for   (   i=0;i <720;i++,pr++,pg++,pb++   )
{
fwrite(pb,1,1,fp);
fwrite(pg,1,1,fp);
fwrite(pr,1,1,fp);
}
pR-=720;
pG-=720;
pB-=720;
if   (   j%57==0   )
printf( "     completed   %d%%\n ",j/57*10);
}
fclose(fp);
printf( "Finished.\n ");
}
此段代码主要就是把内存中的m_dbTargetImageR,m_dbTargetImageG
m_dbTargetImageB这几个首地址的数组的内容写到文件中.
我的问题是在代码中后面用*号注明的那段代码,headerImage这个数组的大小明明是54,为什么在第一个数据块输出函数fwrite(pRGB,2,1,fp);(其中pRGB指向headerImage的首地址,)执行后,第二个fwrite(pRGB+4,52,1,fp);中的地址为什么要加4后,还要输出52个到fp中,那不就地址越界了吗?我的理解是在执行完第一个数据块输出函数fwrite(pRGB,2,1,fp);后应该执行数据块输出函数fwrite(pRGB+2,52,1,fp);这才对.可实验表明我是错的,请高手指出我的原因!!

------解决方案--------------------
(*pRGB)=0x42; pRGB++; // BM
(*pRGB)=0x4d; pRGB++;
pRGB+=2; // 这里多加了2 后面+4,可能是为了跳过这个+2,但

程序整体怎么感觉还有问题,前面的代码是什么