结构体

1.结构体的声明

结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量


struct tag
{
    member-list;	//成员变量
}variable - list	//结构体变量->是全局变量;	//注意此处分号不可以省略

例如:

struct Book
{
	char name[20];
	char author[20];
	int price;
}b1,b2;

struct Book b3;
int main()
{
	struct Book b4;
	return 0;
}

上述的b1,b2,b3为全局变量,b4为局部变量

name,author,price为结构体的成员变量

struct Book ->这一个整体是结构体类型名


2.匿名结构体

struct 
{
    int a;
    char c;
    double d;
}s1,s2;
struct
{
    int a;
    char c;
    double d;
}*p;
int main()
{
   // sturct s4;	//err
    p = &s1;	//报错
}

虽然上面的两个结构体的成员类型都一样,但是编译器会把上面的两个声明当成两个完全不同的类型

匿名结构体只能使用一次


结构体的自引用

//写法1:错误写法
struct Node
{
    int data;
    struct Node next;	
};
//正确写法
struct Node
{
    int data;//数据域
    struct Node* next;//指针域,指向下一个结构体
};

判断:

typedef sturct
{
    int data;
    Node* next;
}Node;
//这样写是否可以?
//不可以,使用Node的时候,还没有定义Node

//正解
typedef sturct Node
{
    int data;
    Node* next;
}Node;

结构体初始化

结构体使用大括号 { } 初始化

struct Point
{
    int x;
    int y;
}p1 = { 5,6 }, p2 = { 7,8 };

struct Point p3 = { 1,2 };
int main()
{
    struct Point p4 = { 3,4 };
    return 0;
}

因为p1是局部变量,走到局部范围内才创建,所以一开始p1内部的值为随机值

image-20220310222334530

而其他是全局变量,程序开始运行就存在了


结构体中含结构体
struct Point
{
    int x;
    int y;
}p1 = { 5,6 }, p2 = { 7,8 };
struct S
{
    double d;
    struct Point p;
};
int main()
{
    struct Point p1 = {3,4};
    struct S s = {3.14, {1,5} };
    return 0;
}

结构体中含数组
struct S
{
    double a ;
    char c ;
    int arr[20];
}
int main
{
    struct S = {3.14,‘a’,{1,2,3} };
    //数组arr只初始化了前面三个的值,后面未初始化为0
    return 0;
}

结构体访问

//方法1:结构体变量.结构体成员
//方法2:(*结构体变量指针).结构体成员
//方法3:结构体变量指针->结构体成员

struct Point
{
    int x;
    int y;
};
struct S
{
    double d;
    struct Point;
    int arr[20];
};
int main()
{
    struct S s = { 3.14,{2,3}, {1,2,3} };
    //方法1:
    printf("%lf %d %d %d\n", s.d, s.p.x, s.p.y, s.arr[0]);
    
    //方法2:
    struct S* ps = &s;
    printf("%lf %d %d %d\n", (*ps).d, (*ps).p.x, (*ps).p.y, (*ps).arr[0]);
    
    //方法3
    printf("%lf %d %d %d\n", ps->d, ps->p.x, ps->p.y, ps->arr[0]);
        return 0;
}