结构体
结构体是什么?
结构体可以让C语言创建新的类型
例如:
创建学生类型
struct Stu
{
char name[20];
int age;
double score;
};
创建书类型
struct Book
{
char name[20]; //成员变量
float price;
char id[30];
};
使用数类型与学生类型
int main()
{
//方法一:
//结构体变量.成员变量
struct Stu s ={"张三",20,90}; //结构体的创建和初始化
printf("%s%d%lf\n",s.name,s.age,s.score); //结构体变量.成员变量
//方法二:
//指针变量
struct Stu * ps =&s;
printf("%s%d%lf\n",(*ps).name,(*ps).age,(*ps).score);//使用指针变量
//方法三:
//结构体指针->成员变量名
printf("%s%d%lf\n",ps->name,ps->age,ps->score);
return 0;
}
Console:
张三 20 85.500000
张三 20 85.500000
张三 20 85.500000
结构体的声明
数组:
一组想同类型的元素的集合
结构体:
也是一些值的集合,但是值的类型可以不同。
结构的声明
结构体关键字 结构体名字
| /
struct Stu
{
//成员变量
char name[20];
itn age;
};
全局结构体变量
struct Stu
{
//成员变量
int s;
}s1,s2; //s1和s2也是结构体变量
s1和s2也是结构体变量,但和里面的s不同的是,s1和s2是全局变量。
结构成员的类型
结构的成员可以是标量、 数组、 指针,甚至是其他结构体。
结构体变量的定义和初始化
结构体变量初始化
struct Stu
{
struct B s2;
char name[20];
int age;
char id[20];
}
int main()
{
struct Stu s ={ { 'c', 20, 3.1},"张三",20,5998};
return 0;
}
{‘w’,20,3.1}是s2 的初始化。
"张三"是name的初始化。
30是age的初始化。
5998是id的初始化。
结构体操作符:
. ->
借助上面的例子,使用结构体操作符:
struct B
{
char c;
short s;
double d;
}
struct Stu
{
struct B s2;
char name[20];
int age;
char id[20];
}
int main()
{
struct Stu s ={ { 'c', 20, 3.1},"张三",20,5998};
printf("%c\n",s.s2.c); //. 操作符
printf("%s\n",s.id);
struct Stu* ps = &s;
printf("%c\n",(*ps).s2.c); //* 操作符
printf("%c\n",ps->s2.c);//->操作符
return 0;
}
Console:
c
5998
c
c
结构体传参
struct B
{
char c;
short s;
double d;
}
struct Stu
{
struct B s2;
char name[20];
int age;
char id[20];
}
//
void printl(struct Stu t)
{
printf("%c %d %lf %s %d % s\n", t.s2.c, t.s2.s, t.s2.d, t.name, t.age, t.id);
}
void printl2(struct Stu* ps)
{
printf("%c %d %lf %s %d % s\n", ps->s2.c, ps->s2.s,, ps->s2.d,, ps->name, ps->age, ps->id);
}
int main()
{
struct Stu s ={ { 'c', 20, 3.1},"张三",20,5998};
//写一个函数打印s的内容
printl(s); //传值调用
printl2(&s); //传址调用
return 0;
}
Console:
c 20 3.100000 张三 20 5998
相比于printl与printl2,哪个函数更好一些?
应该首选printl2函数,是因为:
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。
结论:结构体传参的时候,要传结构体的地址,效果更好