解析结构体和位段

  在C语言中,结构体是一种比较重要的结构,因此,对所学结构体只是做一总结和整理。
   C语言提供了两种数据类型,数组和结构,今天,就简单的整理一下结构相关的。
1.结构体的定义

必须先定义后使用:如


2.结构成员的访

1)直接访问:通过点操作符(.)访问的。

点操作符接受两个操作数,左操作数为结构体的名字,右操作数就是需要访问的成员的名字

如:Stu.name   则访问的是结构体为Stu的成员name。

2)间接访问:就是使用指针来访问一个结构体的成员,前提是有一个指向结构的指针。

即使用->操作符(也叫教头操作符),和点操作符一样,它接受两个操作数,不同的是它的左操作数必须是一个指向结构体的指针。

如:p->sex;              p->name;    

3.不完全申明

  不完全申明适用于一些相互之间存在依赖或者互相引用的结构,即一个结构之中包了含另一个结构的一个或多个成员。

例如:

struct B;struct A{int_a;struct B*_pb;};struct B{int_b;struct A*_pa;};

4.结构体初始化
结构的初始化和数组的初始化很类似,如:
struct A
{
	int a;
	char arr[20];
	double s;
};
int main()
{
	struct A sa = { 10, "abcdef", 3.14 };
	printf("%1f  %1f", sa.a, sa.s);
}
5.结构的存储分配
1)结构的第一个成员永远放在0偏移处
2)从第二个成员开始,都要对齐到某个对齐数的整数倍处。(对齐数:为结构成员自身大小和默认对齐数的较小值。  在VS--8   Linux--4)
3)结构的总大小必须是最大对齐数的整数倍。
例:在windows的状态下:


内存对齐的原因:

1)平台原因(移植原因)
    1>   不是所有的硬件平台都能访问任意地址上的任意数据的;
   2>   某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
 2)性能原因:
  1>  数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
  2>  原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访
6.结构实现位段,位段大小的计算
位段的申明和结构类似,但他的成员是一个或多个位的字段。
位段成员必须申明为int,unsigned int或signed int类型。其次,在成员名的后面是一个冒号和一个整数,这个整数指定该位段的所占用的位的数目。
下面举例具体说明:

值得重视的是位段不跨平台,不存在对齐
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章