结构体
结构体是一种数据结构.
数组也是一种数据结构,但是数组存放的数据类型比较单一,结构体解决了数组里不能存放 多种类型数据 的这种缺陷。
结构体声明,定义
//声明
struct infor // struct infor 是标识符,必须整体使用
{
char name[50]; // (元素)成员变量(属性)
char is_male;
int age;
}; // 分号坚决不能少
//定义
struct infor stu;
//声明时,不占空间,只是声明了一种数据类型,定义时才分配空间
声明时可以直接定义
struct infor
{
char name[50];
char is_male;
int age;
}stu1, stu2, *p_stu = &stu1;
或者定义s变量,一般不会这么写
struct
{
int a;
float b;
char c;
}s;
结构体初始化
struct STU
{
char name[50];
char is_male;
int age;
};
struct STU s1 = {"abc", 1}; //初始化时按成员顺序赋值,不完全初始化时补0.
struct STU s2 = {.age=27, .name="qew"}; //单独赋值。
struct STU *p_stu = &s1;
取成员
结构体变量取成员用 ‘.’ 运算符,结构体指针取成员需要用 ‘->’ 运算符
初始化之后赋值就必须对成员单独一一赋值了。
s1.age = 18;
p_stu -> age = 16;
相同结构体变量之间可以直接赋值,在C++里有个称呼叫做:赋值构造
s1 = s2;
typedef结构体的新类型定义
typedef struct infor
{
int a;
float b;
char c;
}S, *p_S;
//S是struct infor的类型名,p_S是struct infor * 的类型名
//相当于typedef struct infor S;
S a;
p_S p = &a;
结构体类型的大小
计算机为了方便寻址,对结构体有字节对齐策略
struct str1 // 7个字节有效数据
{
int a; // 4,int类型从地址是4的倍数处开始存储
char b; // 1 + 1 //填充了1字节空间
short c; // 2 ,short类型从地址是2的倍数处开始存储
}s1; // 8
struct str2
{
char a; // 1
char b; // 1
// + 2 填充了2字节空间
int c; // 4
}s2; // 8
struct str3 // 6
{
int a;
char b;
char c;
// + 2 填充了2字节空间
}s3; // 8
struct str4 // 10
{
struct str1 s; // 8
char a; // 1 + 3 填充了3字节空间,因为struct str1中有int类型,所以要补齐4个字节。
}s4; // 12
struct str5 // 10
{
short a[4]; // 8
char b; // 1 + 1 填充了1字节空间
}s4; // 10
结构体类型大小与结构体成员中所占字节数最大的那个基本数据类型对齐。