Struct

2022-10-10
简介 Overview
. struct是一个类型定义语句,所以以;结束
. 值的集合;每个值称为结构的成员变量;成员变量类型可以相同,也可以不同;也可以是结构体
. 通常定义在main 外面;声明的变量则可以作为全局变量使用
. 定义只是描述结构,并不占用内存空间;只有实例化时才申请空间
. 和数组名同时也是数组地址不一样,结构体变量名 不是 结构体的地址,必须使用&获取结构体地址
. 传参时最好引用/地址传递,不要值传递。if a large structure is to be passed to a function, it is generally more efficient to pass a pointer than to copy the whole structure.
定义 Definition
1. 具名定义
struct tag{			
    member_list;
};
//使用
struct tag tt;

//定义即声明变量
struct tag{			
    member_list;	
}val_list;
2. 不具名定义:没有结构体名,后续不能声明变量;只能使用这里声明的变量;变量列表,不可略
struct {			
    member_list;
}val_list;
3. typedef定义:起个别名/类型名,注意不是变量名;后续声明变量可以直接使用别名,从而略去struct关键字
typedef struct {	
    member_list;
}STR;

//自引用定义:因为有指针指向自己,不能采用不具名定义
typedef struct str
{
    member_list;
    struct str *other;
} STR;
使用 Usage
直接引用:普通结构体使用点.
变量名 . 成员变量名
间接引用:指针结构体使用箭头->
变量名 -> 成员变量名
[]
#include <stdio.h>
#include <string.h>
typedef struct
{
    int year;
    int mon;
    int day;
} Birth;
typedef struct
{
    int id;
    char name[6];
    Birth birth;
} Stu;
int main(void)
{
    Stu stu = {1, "guilin", {2022, 12, 20}};
    printf("%d\t%s\t%d-%d-%d\n", stu.id, stu.name, stu.birth.year, stu.birth.mon, stu.birth.day);
    Stu *p = &stu;
    printf("%d\t%s\t%d-%d-%d\n", p->id, p->name, (p->birth).year, (p->birth).mon, (p->birth).day);
    //部分赋值
    stu.id = 101;
    strcpy(stu.name, "pla");
    printf("%d\t%s\t%d-%d-%d\n", stu.id, stu.name, stu.birth.year, stu.birth.mon, stu.birth.day);
    //使用IO修改
    scanf("%d%s", &stu.id, stu.name);
}
内存对齐 Alignment
什么是内存对齐
为什么要内存对齐
. 方便数据访问
如何实现内存对齐
内存地址号/类型大小:
. 如果能整除,就从当前地址开始存储
. 如果不能整除,就+1个字节,直到可以整除
数据类型 地址倍数
char 1
int 4
float 4
double 8
[]A
typedef struct
{
    char a;
    short b;
    int c;
} A;
A Byte Byte Byte Byte
char a short b
int c
[]B
typedef struct
{
    int c;
    short b;
    char a;
} B;
B Byte Byte Byte Byte
int c
short b char a
[]C
typedef struct
{
    char a;
    int c;
    short b;
} C;
C Byte Byte Byte Byte
char a
int c
short b
[]D
typedef struct
{
    char a;
    char d;
    short b;
    int c;
} D;
D Byte Byte Byte Byte
char a char d short b
int c
[]E
typedef struct
{
    char a;
    short b;
    char d;
    int c;
} E;
E Byte Byte Byte Byte
char a short b
char d
int c
[]F
typedef struct
{
    char a;
    short b;
    int c;
    char d;
    short f;
    char e;
} F;
F Byte Byte Byte Byte
char a short b
int c
char d short f
char e
注意事项
. 不同的平台,对齐策略不尽相同
. 内存对齐会导致空间浪费,所以很少直接使用结构体作为形式参数,而是使用对应的结构体指针