结构体是一种构造类型的数据结构,是一种或多种基本类型或构造类型的数据的集合。
struct tag {
member-list
member-list
member-list
...
} variable-list ;
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
这个结构体并没有标明其标签,以后只可以使用s1这个变量,不能再定义其他变量了,代码如下:
struct
{
int a;
char b;
double c;
} s1;
结构体的标签被命名为SIMPLE,没有声明变量,代码如下:
struct SIMPLE
{
int a;
char b;
double c;
};
也可以用typedef创建新类型,代码如下:
typedef struct sim
{
int a;
char b;
double c;
} Simple2;
可以用Simple2作为类型声明新的结构体变量 Simple2 u1, u2[20], *u3;
废话不多说,直接上代码
struct stu {
int num;
char name[20];
char sex;
char* addr;
};
struct stu boy;
struct stu lucy = {101, "lucy", 'f'};
必须按照顺序进行初始化,中间字段不可以不赋值,后面的字段可以不初始化。
注意:struct stu lucy = {101, , ‘f’};这种写法是错误的
boy.num = 100;
strcpy(boy.name, "bob");
boy.sex= 'a';
boy.addr="address";
相同类型的结构体可以相互赋值,如boy = lucy;
由若干个相同类型的结构体变量构成的集合。
struct 结构体类型名 数组名[元素个数]
struct stu edu[3];
edu[0].num=100;
即结构体的地址,定义一个变量来存放这个地址,这个变量就是结构体指针变量。
struct 结构体类型名 *结构体指针变量名
struct stu{
int num;
char name[20];
};
struct stu *p;
struct stu boy;
p=&boy;
(*p).num = 100; 或者p->num = 100; 或者boy.num = 100;
结构体变量大小,是所有成员大小之和,但是在实际结构体变量分配内存的时候是规则的,实际会多分配一些内存。
规则1
规则2
字节对齐的目的:用空间来换时间,提高CPU读取数据的效率。
指定对其原则
1.#pragma pack(value)
#pragma pack(2)
2.以多少个字节为单位开辟内存
结构体成员中,占字节数最大的类型长度和value比较,取较小值为单位开辟内存。
在结构体中,以位为单位的成员,称之为位段(位域)。
struct stu {
unsigned int a:2;
unsigned int b:4;
unsigned int i;
} data;
不能对位段成员取地址,因为这个位段成员可能不够一个字节。