2026年1月10日学习总结:
今天开启了初阶的新篇章------结构体,关于结构体的相关内容主要分为以下三个部分:
(1)结构体的声明和结构体变量的初始化
1.结构体的基础知识
结构体的定义:结构是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
与数组的区别:数组是相同类型的集合,而结构体可以是不同类型变量的集合。
如何更好理解呢?
可以理解为结构体是一种定义复杂对象的一种描述方式,常见的复杂对象有人(包含姓名,电话,性别,身高等)、书(包含书名,作者,定价,书号等)等,而该方式内可以用不同的内置类型(如int、long、char、double等)来帮助描述。
2.结构体的声明形式: struct tag
{
member_list;
}variable_list; 其中struct结构体关键字,tag结构体标签(可以自定义),member_list成员列表(可一个或多个), variable_list使用该类型创建的变量(可有可无,一般不建议使用)。
3.结构体成员的类型:可以是标量、数组、指针、甚至是其他结构体。
结构体变量的创建和初始化:
cs
struct pro
{
char name[20];
char tele[20];
char sex[4];
int high;
}p1;//使用上述方法创建变量,在该位置为全局变量
struct pro p2;//使用创建好的结构体类型创建变量
struct st
{
struct pro p;//其他结构体(前提是使用的结构体需要在该结构体之前已经定义)
char num[18];
float f;
};
//以上两种方法均可在主函数(main)中创建
int main()
{
struct pro p3 = { "张三","12348889560","男",181 };//创建和初始化可以一起
struct st s = { {"lisi","1592398888","女",168},50,3.14 };//变量中有其他结构体的初始化
return 0;
}
(2)结构体成员变量的访问
1.通过结构体变量访问成员变量:
使用点操作符(.)进行访问,点操作符接受两个操作数
基本形式:结构体变量.成员变量
cs
int main()
{
struct pro p3 = { "王五","18266698888","女",170 };
struct st s = { {"lisi","1592398888","女",168},"50",3.14 };
printf("%s %s %s %d\n", p3.name, p3.tele, p3.sex, p3.high);
printf("%s %s %s %d %s %s %f\n", s.p.name, s.p.tele, s.p.sex, s.p.high, s.num, s.f);
return 0;
}
2.通过结构体指针访问指向变量的成员
①使用点操作符:(*结构体指针).成员变量 ②使用->操作符:结构体指针->成员变量
cs
//使用点操作符:(*结构体指针).成员变量
void print1(struct pro* p)
{
printf("%s %s %s %d\n", (*p).name, (*p).tele, (*p).sex, (*p).high);
}
//使用->操作符:结构体指针->成员变量
void print2(struct pro* p)
{
printf("%s %s %s %d\n", p->name, p->tele, p->sex, p->high);
}
int main()
{
struct pro p3 = { "王五","18266698888","女",170 };
struct st s = { {"lisi","1592398888","女",168},"50",3.14 };
printf("%s %s %s %d\n", p3.name, p3.tele, p3.sex, p3.high);
printf("%s %s %s %d %s %f\n", s.p.name, s.p.tele, s.p.sex, s.p.high, s.num, s.f);
print1(&p3);
print2(&p3);
return 0;
}
(3)结构体传参 1.结构体变量传参 2.结构体指针传参
cs
//①结构体变量传参
void print3(struct pro p)
{
printf("%s %s %s %d\n", p.name, p.tele, p.sex, p.high);
}
//②结构体指针传参
void print4(struct pro* p)
{
printf("%s %s %s %d\n", p->name, p->tele, p->sex, p->high);
}
int main()
{
struct pro p3 = { "王五","18266698888","女",170 };
struct st s = { {"lisi","1592398888","女",168},"50",3.14 };
print3(p3);
print4(&p3);
return 0;
}
以上两种传参方法中首选结构体指针传参
原因:传参时需要压栈,如果一个传递的结构体过大,参数压栈的系统开销比较大,会导致性能下降。