1. 结构体
结构体(struct)是有一系列具有相同类型或不同类型的数据构成的数据集合.是一种数据结构!这些数据被称为成员变量。
结构体成员可以是:标量,数组,指针或其他结构体。
结构体声明
例:
struct student
{
char name[20];
int age;
char sex[5];
};
这里声明了一个student类结构体。它包含了3个成员变量——name,age,sex。
在声明一个结构体时也可以不完全声明!
struct
{
int a;
int arr[10];
char arr1[10];
}x; //匿名结构体
结构体也可以在某个函数内部声明,但这个结构体只能在该函数中使用!
结构体变量的定义
- 在声明时同时定义结构体变量
struct student
{
char name[20];
int age;
char sex[5];
}stu1,stu2;//声明的同时定义了结构体变量stu1,stu2。
2.在函数内部定义
struct student
{
char name[20];
int age;
char sex[5];
};
int main()
{
struct student stu1, stu2;
//定义变量stu1,stu2。
return 0;
}
结构体成员的访问
结构体变量访问结构体成员是通过操作符“ . ” 来实现的。
struct stu
{
char name[20];
int age;
char sex[5];
};
int main()
{
struct stu s1;
strcpy(s1.name,"葫芦娃");
s1.age = 20;
strcpy(s1.sex,"男");
return 0;
}
若我们得到的是结构体指针,我们可以这样访问:
struct stu
{
char name[20];
int age;
char sex[5];
};
void print(struct stu *pc)
{
printf("%s\n",*(pc).name);
printf("%d\n",*(pc).age);
printf("%s\n",pc->sex);
}
结构体的自引用
例子:
struct node
{
int data;
struct node *next;
};
结构体不完整声明
struct A
{
int a;
struct B* b;
}
struct B
{
int b;
struct A* a;
}
//错误写法
正确写法如下:
struct B;
struct A
{
int a;
struct B* b;
}
struct B
{
int b;
struct A* a;
}
结构体变量的初始化
struct stu
{
char name[20];
int age;
char sex[5];
}s1 = {"葫芦娃",20,"男"};//声明时定义结构体变量s1并初始化
//
//
struct stu
{
char name[20];
int age;
char sex[5];
};
struct stu s2 = {"葫芦娃娃",20,"女"};
结构体对齐
struct s1
{
char c1;
int c2;
char c3;
};
printf("%d\n",sizeof(struct s1));// 12
//
//
struct s2
{
char c1;
char c3;
int c2;
};
printf("%d\n",sizeof(struct s2));// 8
//
//
struct s3
{
double c1;
char c2;
int c3;
};
printf("%d\n",sizeof(struct s3));// 16
//
//
struct s4
{
char c1;
struct s3 s;
double i;
};
printf("%d\n",sizeof(struct s4));// 32
结构体内存对齐方法
1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址。对齐数 = 编译器默认对齐数与该成员大小的较小值。Windows 默认8 linux默认4。
3.结构体总大小为所有成员中的最大对齐数的整数倍!
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处。
结构体传参!
结构体传参直接传地址,不跟你多废话!
位段
位段的声明跟结构体一样,但有两个不同:
位段的成员数据类型必须是 int ,unsigned int 或 signed int,char。
位段的成员后面必须跟冒号“:” 和一个数字。
struct i
{
unsigned int a:12;
int b:16;
signed int c:32;
};//冒号后的数字的范围是根据 数据类型来确定的!(int(32b),char(8b))
printf(“%d\n”,sizeof(struct i));
位段的内存分配
位段的成员数据类型是 int ,unsigned int 或 signed int,char。
位段的空间开辟是以4B(int)或1B(char)来开辟的。
位段不支持跨平台使用。