工作中的C语言应用技巧记录

一、函数指针的应用

void (*IAP_Entry) (u32 param_tab[], u32 result_tab[]);
IAP_Entry = (*(void(*)())IAP_ENTER_ADR);
IAP_Entry = (*(void(*)())IAP_ENTER_ADR);

(*IAP_Entry)(paramin, paramout);

void (*userProgram)();
userProgram = (void (*)()) (USER_PROG);
(*userProgram)(); == userProgram();

 


typedef int (init_fnc_t)(void);
init_fnc_t *init_sequence[]=
{
  cpu_init,
  board_init,
  env_init,
  init_baudrate,
  NULL,
};

for(init_fnc_ptr=init_sequence; *init_fnc_ptr;++init_fnc_ptr)
{
  if((*init_fnc_ptr)()!=0)//==init_fnc_ptr()!=0
   hang();
}

void (*GprsFuncVect[])(char *str)=
{
  NULL,
  GPRS_DataStream,
  NULL
};


void (*theKernel)(int zero,int arch,uint params);

theKernel=(void (*)(int,int,uint))ntohl(hdr->ih_ep);

theKernel(0,bd->bi_arch_number,bd->bi_boot_params);

 

二、字节的对齐方式

struct A{
 int a;
 char b;
 short c;
};
结构体A包含了4B的int一个,1B的char一个,2B的
short一个,总共7字节。但因为编译器
要对数据成员在空间上进行对齐:因此
sizeof(struct A)=8;

而如果把a,b位置对调,则sizeof(struct A)=12;
这是因为按4字节对齐方式,b占2B,而接下来a又必须是4字节对齐,
因此b实际上点4B,总共需要10B,而编译器又需要对结构体进行字对齐,
因此就是12字节。
使用#pragma pack(?)
      ...
      #pragma pack()
来改变对齐方式
 字节对齐四个概念:
 1.数据类型自身的对齐:即基本数据类型的自身对齐值。
 2.指定对齐值:#pragma pack(value)时指定对齐值value
 3.结构体或类的自身对齐值:其成员中自身对齐值最大的那个值
 4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值
 中较小的那个值
 
 有了这些值,就可以很方便地讨论具体
 数据结构的成员和其自身的对齐方式。
 有效对齐值N是最终用来决定数据存放地址方式的值
 ,最重要。有效对齐N,就是表示对齐在N上,
 也就是说该数据的存放起始地址%N=0,而数据
 结构中的数据变量都是按定义的先后顺序来存放的
 ,第一个数据变量的起始地址就是数据结构的
 起始地址,结构体的成员变量要对齐存放。
 
 结构体本身也要根据自身的有效对齐值
 圆整(即结构体成员变量占用总长度需要是
 对结构体有效对齐值的整数倍)。

struct
{
 char a[20];
 char g;
 int  b;
 int  c;
 long d;
 struct
 {
  char x[50];
  int d;
 }f;

}abc,*pabc=&abc;

sizeof(abc):92  //20+4+4+4+1=33--->36+56=92
sizeof(pabc):4    //指针类型数据占用字节数:4
sizeof(*pabc):92//指向一个具体的数据结构体
sizeof(pabc->a):20
sizeof(pabc->f):56  //四字节对齐考虑

 

三、大小端

大小端,会和具体的处理器架构、编译器有关
小端存储:数据高位存放在高字节;低位存放在低字节
如:0x1234     low:0x34   high:0x12
数据从小到大,地址从低到高
大端存储:数据低位存放在高字节;高位存放在低字节
如:0x1234    low:0x12    high:0x34
数据从大到小,地址从低到高
判断大小端函数:
int checkCPU()
{
  union
  {
    int a;
    char b;
  }c;
  c.a=1;
  return (c.b == 1);//小端返回TRUE,大端返回FALSE
}

 

 

 

你可能感兴趣的:(软件,语言)