结构体
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内部的值为随机值
而其他是全局变量,程序开始运行就存在了
结构体中含结构体
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;
}