结构体的声明
1. 什么是结构?结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
数组:一组相同类型元素的集合
结构体:一组不一定相同类型元素的集
2. 结构的声明
cpp
struct tag //tag根据实际情况给名字
{
member_list; //成员列表(一个或多个)
}variable_list; //变量列表
//例子:描述一个学生
struct Stu
{
//成员变量用来描述结构体对象的相关属性
char name[20]; //名字
int age; //年龄
char sex[5]; //性别
}s2, s3; //这里可以创建结构体变量 - 全局变量
//typedef用法
typedef struct Stu
{
char name[20];
int age;
char sex[5];
}Stu; //将struct Stu 重命名为 Stu
int main()
{
struct Stu s1; //局部变量
Stu s4;
}
3. 结构成员的类型
cpp
//结构的成员可以是标量、数组、指针,甚至是其他结构体。
struct S
{
int a;
char arr[5];
int* p;
};
struct A
{
struct S s;
double d;
};
4. 结构体变量初始化
cpp
struct S
{
int a;
char arr[5];
int* p;
}s1 = {100, "abc", NULL}; //第一种初始化
struct S s2 = {12, "fhs", NULL}; //第二种初始化
struct S s3 = {.arr="asd", .p=NULL, .a=1}; //第三种自己找到成员然后初始化
printf("%d %s %p\n", s3.a, s3.arr, s3.p); //. 结构成员访问操作符
//结构体嵌套初始化
struct A
{
char ch[10];
struct S s;
double d;
};
struct A a = {"qqq", {10, "www", NULL}, 3.14};
printf("%s %d %s %p %lf\n", a.ch, a.s.a, a.s.arr, a.s.p, a.d);
结构体成员的访问
cpp
//1. 结构体变量访问成员
printf("%d %s %p\n", s3.a, s3.arr, s3.p); //. 结构成员访问操作符
printf("%s %d %s %p %lf\n", a.ch, a.s.a, a.s.arr, a.s.p, a.d);
//2. 结构体指针访问指向变量的成员
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;
}
结构体传参
下面的 print1 和 print2 函数哪个好些?答案是:首选print2函数。
cpp
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 print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}
原因:函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的 下降。
结论: 结构体传参的时候,要传结构体的地址。