一、结构体的声明
1.1、结构的基本知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2、结构的声明
struct tag
{
member-list;
}variable-list;
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];
int height;
}S1,S2,S3;//全局变量,一般不用
int main()
{
struct Stu S4;//局部变量
return 0;
}
1.3、结构体成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
1.4、结构体变量的定义和初始化
#include<stdio.h>
struct point
{
int x;
int y;
};
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];
int height;
}S1,S2,S3;
struct Q
{
char a;
struct point pp;
double d;
char str[20];
};
int main()
{
struct point p = { 10,20 };//初始化
printf("%d %d\n",p.x ,p.y );
struct Stu s = { "zhangsan",20,"男",180 };
printf("%s %d %s %d \n", s.name, s.age ,s.sex, s.height);
struct Q ss = { 'x',{100,200},3.14,"hehe" };
struct Q sss = { .d = 5.00,.pp.x = 150 };
printf("%c %d %d %lf %s\n",ss.a,ss.pp.x ,ss.pp.y ,ss.d ,ss.str );
printf("%c %d %d %lf %s\n",sss.a,sss.pp.x ,sss.pp.y ,sss.d ,sss.str );//可以乱序初始化
//修改
strcpy(s.name, "zhangsanfeng");
printf("%s\n",s.name );
return 0;
}
二、结构体成员的访问和传参
2.1、结构体的访问
struct S
{
int date[1000];
char buf[100];
};
void print1(struct S ss) //值传递
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ",ss.date[i]);//结构体变量.结构体成员
}
printf("%s\n",ss.buf );
}
void print2(struct S* ps)
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ",ps->date[i]);//结构体指针->结构体成员名
}
printf("%s",ps->buf );
}
int main()
{
struct S s = { {1,2,3},"hehe"};
print1(s); //传值调用
print2(&s); //传址调用
return 0;
}
上面的 print1 和 print2 函数哪个好些?
答案是:首选print2函数。
原因:函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以
会导致性能的下降。
结论:结构体传参的时候,要传结构体的地址。