C语言__结构体总结

结构体内成员对齐规则

①结构体变量本身就是在4字节对其位置,由编译器来完成。

②第一个成员,就从结构体开始的地址处存放,这个元素具体占多少个字节,由紧挨着下一个元素决定。

③整个成员变量自身都对齐了,还没有结束。

④整个结构体还要是默认字节大小的整数倍。

typedef struct data
{
	int a;
	char b;
	short c;
 }D;
 sizeof(D)=8;
结构体默认的字节对齐:成员变量最大的那个类型所占的字节。

对齐指令

#pragma pack(n)  (1,2,4,8......)

#pragma pack( )

这两个配合使用,表示一个区间,只有这个区间内的结构体享受这个待遇。

设置为1,就是不对齐。

好处

①:充分利用空间,牺牲了速度,降低了访问效率。

不为1,设置对齐

好处:提高了效率,性能,牺牲了空间。

typeof()关键字,专门用于获取类型,()里可以放变量名,或者表达式。
  int *p;
变量名做参数时:typeof(p)p_a=&a; 等价于 int *p_a=&a;
表达式做参数时:typeof(*p)p_b;   等价于int p_b; 因为*p就是int类型。
结构体的宏:
    linux内核里的两个宏(在驱动中应用广泛)
1:off_set_of(type,member)用来计算结构体内元素的偏移量。
    (long)&(((type* )0)->member)
解析:(type *)0指向结构体的零地址
      ((type *)0)->member得到了结构体某个成员变量名 
      给这个成员变量名,区地址(相当于零地址),此时 &(((type *)0)->member)表示的是指针类型
  最后,强制类型转换为long
2:containe_of(ptr,type,member),ptr是结构体里成员变量的指针,通过调用这个宏得出结构体的首地址,包含两句代码,
  必须要加{}
  

  #define containe_of(ptr,type,member)\
  ({typeof(((type *)0)->member)*_mptr=ptr;\
  (char *)_mptr-off_set_of(type,member);}) 


   解析:得到结构体成员变量的类型
             指针赋值(得到真实成员变量的地址值)
     减去偏移量得到一个数字,该数字和结构体变量成员本身地址在数值上是一样的。
     最后强制转换类型转换为结构体指针类型

位字段
   位字段专用于结构体,结构体成员的类型必须是:int 或者 unsigned int
    有时候,结构体成员表示的数据很小,就用几个位来表示。

	 struct data
	 {
	    unsigned a:1;//1就是一个位,范围0~1 
	    unsigned b:2;//2就是两个位,范围0~3	
	 }	
         超出位字段表示的数据范围,结果不可预期。
字段不可取地址,不能用结构体指针方式访问
无名字段,不可访问,知识占位。
32位就是4个字节,相当于一个int。
位字段的下一个字段不够在剩余的bit存放时,必须另起一个字段,字段不可以跨字。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值