目录
什么是结构体
结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量。
struct Student
{ //成员变量;
char name[10];
int age;
char id[10];
}l1,l2;//这里创建的也是两个结构体变量;
//这里创建的是全局变量;
结构体内定义结构体
struct B {
char a;
int price;
};
struct Student
{ //成员变量;
struct B b;
char name[10];
int age;
char id[10];
}l1, l2;//这里创建的也是两个结构体变量;
//这里创建的是全局变量;
结构体创建对象
struct Student s;//对象,但是局部变量;
结构体的成员类型
可以是:数组,指针,标量,甚至是其他结构体。
结构体的定义和初始化
int main()
{
struct Student s = { "张三",20,"201304010" };//初始化结构体;
return 0;
}
通过结构体来访问对象
结构体访问变量是通过操作符点来访问成员变量的(.)例如:
struct Student s = { {'a',35},"张三",20,"201304010"};//初始化结构体;
printf("%s %d %s", s.name, s.age, s.id);
return 0;
通过->字符来访问结构体
int main()
{
struct Student s = { {'a',35},"张三",20,"201304010"};//初始化结构体;
printf("%s %d %s\n", s.name, s.age, s.id);
struct Student* p = &s;
printf("%c %d %s %d %s", p->b.a, p->b.price, p->name,p->age, p->id);
return 0;
}
运行结果
通过函数来访问结构体进行打印的两种方法
#include<stdio.h>
struct B {
char a;
int price;
};
struct Student
{ //成员变量;
struct B b;
char name[10];
int age;
char id[10];
}l1, l2;//这里创建的也是两个结构体变量;
//这里创建的是全局变量;
void printf1(struct Student t)
{
printf("%s %d %s\n", t.name, t.age, t.id);
}
void printf2(struct Student* ps)
{
printf("%c %d %s %d %s", ps->b.a, ps->b.price, ps->name, ps->age, ps->id);
}
int main()
{
struct Student s = { {'a',35},"张三",20,"201304010"};//初始化结构体;
printf("%s %d %s\n", s.name, s.age, s.id);
struct Student* p = &s;
printf("%c %d %s %d %s\n", p->b.a, p->b.price, p->name,p->age, p->id);
printf1(s);//传值调用
printf2(&s);//传址调用
return 0;
}
打印结果
两种方法的比较
第一种paintf1(s)的方法是需要重新开辟一个空间来进行传值(空间和时间的双重让费)
二第二种方法只需要传递一个s的地址(指针大小的空间)比第一种传参的效率更高。
第二种可以改变主函数里面s的参数。
栈的特点:是一种数据结构。先进的后出,后进的先出
例如
结果:
函数传参时,参数是需要压栈的。如果传递的一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
所以:在进行传参的时候要传地址;