C语言中的结构体

C语言中的结构体

C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为 变量指针数组等,用以实现较复杂的 数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。 [1]  

定义与声明

结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。 [1]  
1
2
3
  struct  tag {
  member-list
  } variable-list ; 
在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例: [1]  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
 
struct  {
 
     int  a;
 
     char  b;
 
     double  c;
 
} s1;
 
 
//同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct  SIMPLE{
 
     int  a;
 
     char  b;
 
     double  c;
 
};
 
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct  SIMPLE t1, t2[20], *t3; 
//也可以用typedef创建新类型
typedef  struct {
     int  a;
     char  b;
     double  c; 
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令t3=&s1,则是非法的。 [1]  
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的 指针,而通常这种 指针的应用是为了实现一些更高级的数据结构如链表和树等。 [1]  
1
2
3
4
5
6
7
8
9
10
//此结构体的声明包含了其他的结构体
struct  COMPLEX{
     char  string[100];
     struct  SIMPLE a;
}; 
//此结构体的声明包含了指向自己类型的指针
struct  NODE{
     char  string[100];
     struct  NODE *next_node;
};
如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示: [1]  
1
2
3
4
5
6
7
8
9
10
11
struct  B;    
//对结构体B进行不完整声明 
//结构体A中包含指向结构体B的指针
struct  A{
     struct  B *partner;
     //other members;
}; 
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct  B{
     struct  A *partner;
     //other members;};

结构体作用

结构体和其他类型基础 数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。 [1]  
在实际项目中,结构体是大量存在的。研发人员常使用结构体来 封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。 [1]  
结构体在 函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。 [1]  

结构体的大小与内存对齐

结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit 字长的CPU,对这类型的CPU取4个 字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的 编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过 预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。 [1]  
规则:
1、 数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。 [1]  
2、结构(或联合)的整体对齐规则:在 数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。 [1]  
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值