结构体
结构体类型的声明
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
结构的声明
struct tag
{
member-list;
}variable-list;
例子:创建一个学生变量
struct Stu
{
//成员变量
char name[20];
int age;
char tele[12];
char sex[5];
};
int main()
{
struct Stu s;//学生
return 0;
}
全局变量和局部变量:
struct Stu
{
//成员变量
char name[20];
int age;
char tele[12];
char sex[5];
}s1,s2;
struct Stu sx;
//sx,s1,s2是全局的
int main()
{
struct Stu s;//学生
//s,s3,s4局部变量
struct Stu s3;
struct Stu s4;
return 0;
}
结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
结构体初始化
初始化:
struct Point {
int x;
int y;
};
int main() {
struct Point p = { 1,2 };
printf("%d %d\n", p.x, p.y);
}
结构体嵌套:
struct Point
{
int x;
int y;
};
struct S
{
char arr[10];
struct Point p;
double d;
int *ptr;
};
int main()
{
int a = 2021;
struct S s = { "abcdef", {2, 3}, 3.14, &a};
printf("%s %d %d %lf %d\n", s.arr, s.p.x, s.p.y, s.d, *(s.ptr));
return 0;
}
结构体成员访问
结构体变量访问成员结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。例
如:
我们可以看到s有成员name和age;那我们如何访问s的成员?
struct S s;
strcpy(s.name, "zhangsan");//使用.访问name成员s.age = 20;//使用.访问age成员
结构体指针访问指向变量的成员有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。
那该如何访问成员。如下:
结构体传参
struct S {
char arr[1000];
int num;
double d;
};
//每次调用 print1()函数,都要重新为结构体开辟一块空间,资源浪费很大
void print1(struct S ss) {
printf("%s %d %lf\n", ss.arr, ss.num, ss.d);
}
//下面的形式,相对来说更好,因为传的是地址
void print2(struct S* ps) {
printf("%s %d %lf\n", ps->arr, ps->num, ps->d);
}
int main() {
struct S s = { "hello bit", 100, 99.8 };
print1(s);//print 函数来打印结构体的数据
print2(&s);
return 0;
}
上面的print1和print2函数哪个好些?
答案是:首选print2函数。原因:
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈
的的系统开销比较大,所以会导致性能的下降。