一,结构体的声明
1.结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同的类型。
我们知道数组是用来存放一组相同类型元素的集合,如int,char,float....
而在现实生活中有很多复杂的对象,比如人有很多的属性,这些属性的类型也不完全相同。这个时候我们就要用到结构体了。
人:名字,电话,性别,身高.......//名字,电话,性别为char类型,身高为int类型。
2.结构的声明
模板为:
struct tag //struct(不可变)为结构体关键字 tag(可变)为结构体标签 一起构成结构体类型
{
member-list; //成员列表(一个或多个)
}variable-list; //变量列表(一个或多个),就是用上面创建的结构体类型构建的结构体变量
例子:人:名字,电话,性别,身高
struco Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}p1,p2;
上面就构建了一个人的结构体,包括了姓名,电话,性别,身高。并且创建了两个结构体变量,p1和p2。
接着就可以在mian()函数中创建结构体变量
int main()
{
struct Peo p1={0};//创建结构体变量 注意:这时才真实的占用了内存创建了结构体,而上
return 0; 面结构体的声明是绘制蓝图,无实际内存的占用。
}
3.结构体成员的类型
结构体成员的类型可以是任意合法的数组类型,包括基本数据类型(int,char,float..),指针,数组和其他结构体类型。
struct St
{
struct Peo p;//struct Peo这个结构体成为了本结构体的结构体成员
int num;
float f;
};
4.结构体变量的定义和初始化
上面定义了结构体类型,接着就是定义结构体变量,就是常见结构体变量和初始化。
(1)在主函数中定义结构体变量和初始化
int main()
{
struct Peo p1 = {"张三","18837301874","男",180};
struct St s = { {"丽丽","15660563728","女",166},100,3.14};
return 0;
}
(2)在定义结构体时就定义结构体变量,然后在主函数中初始化
struco Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}p1;//定义struco Peo结构体时就定义结构体变量p1
struct St
{
struct Peo p;//struct Peo这个结构体成为了本结构体的结构体成员
int num;
float f;
}s;//定义struct St结构体时就定义结构体变量s
在主函数中初始化
int main()
{
p1 = {"张三","18837301874","男",180};
s = { {"丽丽","15660563728","女",166},100,3.14};
return 0;
}
二,结构体成员的访问
在定义好结构体,创建结构体变量并且初始化之后,我们要看看结构体的数据是否正确。
打印结构体的成员
int main()
{
//利用结构体对象.结构体成员
printf("%s %s %s %d\n", p1.name, p1.tele, p1.sex, p1.high);
printf("%s %s %s %d %d %f\n", s.p.name, s.p.tele, s.p.sex, s.p.high, s.num, s.f);
//利用结构体地址->结构体成员
print1(&p1);
return 0;
}
void print1(struct Peo* ps)
{
printf("%s %s %s %d",ps->name,ps->tele,ps->sex,ps->high);
}
三,结构体传参
上面已经用到了结构体传参了,就是print1函数的使用。
其中print1()函数的参数是结构体的地址,就是用结构体指针。
下面的print2()函数的参数是结构体对象
void print2(struct Peo p)//会拷贝实参,占用内存,会造成空间和时间的浪费。
{
printf("%s %s %s %d",p.name,p.tele,p.sex,p.high);
}
上面两个函数中,首选print1函数
因为:函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
结论:
结构体传参的时候,要传结构体的地址。