提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、结构体类型的声明
结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构的声明
struct tag
{
member-list;
}variable-list; (可有可无)
代码演示
struct Stu
{
//成员变量
char name[20];
int age;
char tele[12];
char sex[5];
}s1,s2;
struct Stu s3;//全局变量
//s1,s2是全局变量
int main()
{
struct Stu s;//学生
//局部变量
struct Stu s1;
struct Stu s2;
return 0;
}
结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体
二、结构体变量的定义和初始化
有了结构体类型,那如何定义变量,其实很简单
struct B
{
char c;
int i;
};
struct S
{
char c;
int num;
int arr[10];
double* pd;
struct B sb;
struct B* pb;
};
int main()
{
double d = 3.14;
//按照顺序初始化
struct S s1 = { 'q', 100, { 1, 2, 3 }, &d, { 'a', 99 }, NULL };
//指定成员来初始化
struct S s2 = { .num = 1000, .arr = { 1, 2, 3, 4, 5 } };
return 0;
}
三、结构体成员访问
结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的,点操作符接受两个操作数
结构体指针访问指向变量的成员
有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针,用(->)访问
代码演示
struct Stu
{
char name[20];
int age;
};
void print(struct Stu* ps)
{
printf("name=%s age=%d\n", (*ps).name,(*ps).age);
printf("name=%s age=%d\n", ps->name, ps->age);
}
int main()
{
struct Stu s = { "zhangsan", 20 };
print(&s);//结构体地址传参
return 0;
}
运行结果
四、结构体传参
代码演示
struct S
{
int data[1000];
int num;
};
struct S s = { { 1, 2, 3, 4 }, 1000 };
//结构体传参
void print1(struct S s)//形参是实参的临时拷贝
{
printf("%d\n", s.num);
}
//结构体地址传参
void ptint2(struct S* ps)//传递的是指针的大小
{
printf("%d\n", ps->num);
}
int main()
{
print1(s);//传结构体
print2(&s);//传地址
return 0;
}
面对print1和print2函数,首选print2函数
原因
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,会导致性能的下降
结论
结构体传参的时候,要传结构体的地址,同时可以提高效率