

结构体(Struct)是一种用户自定义的数据类型,允许将不同类型的数据组合成一个逻辑单元。它用于表示具有多个属性的实体,例如存储学生信息(姓名、年龄、成绩等)或几何图形(坐标、颜色等)。
先上代码案例
struct STR
{
int a;
char b;
double c;
};如图:结构体的组成部分
1,关键字 struct
2,结构体类型名字
3,结构体成员变量({成员列表})
4,结构体临时创建变量({变量列表})
先上代码
struct STR B1 ={123,'cifang',3.14};此为方法一:我们创建一个struct STR 类型的结构体变量B1,然后对他的成员变量一一对应地进行初始化。
struct STR B2={.b='cifang',.a=100,.c=3.256};此为方法二:我们通过结构体成员访问操作符“.”,访问每一个结构体成员变量然后对他们进行初始化:具体格式参考如上。
struct tag
{
member-list;
}variable-list;结构体创建的另外一种方法:如图,在结构体变量tag创建之时在variable-list(变量列表)创建变量。
创建结构体指针类型:实际上在后大括号后加一个*表示指针即可。
我们这里以打印结构体为例子;
OK,先认识两个结构体成员访问操作符:“.”和“->”
struct S
{
int data[1000];
int num;
};
void print2(struct S* ps)//①
{
printf("%d\n", ps->num);//②
}如图,这是一个不完整的代码:
在①处:我们通过某个函数传递某个结构体的指针给一个同类型结构体指针ps
在②处:我们通过ps这个指针找到这个结构体中的num成员。
由此可见:操作符“->”的作用是通过结构体的指针找到结构体的成员
struct S
{
int data[1000];
int num;
}
void print1(struct S s)
{
printf("%d\n", s.num);
};如图:同样是一个不完整的代码:
这次,我们改变传址为传值方法。print1函数接收后用"."找到成员num。(事实上这非常简单)
由此:我们同时也了解到了两者对应的不同应用场景。传值和传址。
而传址和传值这两种方法比较一下,实际上不难的出结论:
传址比传值要好的多
原因:函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。 如果传递⼀个结构体对象的时候,结构体过⼤,参数压栈的的系统开销⽐较⼤,所以会导致性能下降。
所以我们得出这样一个结论: 结构体传参的时候,要传结构体的地址。
struct
{
int a;
char b;
float c;
}p1,p2;
可见:以上这个结构体没有名称,这种结构体被称为匿名结构体,又叫做结构体的不完全声明。
特点一:匿名结构体类型只能在其变量列表中创建变量且只能这么做。
也就是说:匿名结构体在程序中只能使用一次,如果还要创建同样的变量就必须再次创建这样一个结构体。
特点二:先看代码
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
p = &x;看代码,可能我们认为p和&x是一样的,但事实上他们并不相同:
这就是匿名结构体的特点二:匿名结构体之间各不相同,即使创建了完全相同的menmbers,也会被编译器认为是不相同的结构体。
于是:我们为了解决这些问题:最终引出结构体重命名:
typedef struct
{
int data;
}Node;我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=9cmybdoqp8r