1、结构体的声明
结构体是一些类型的集合,通过这个结构体可以让用户自定义出一个变量类型
struct str
{
int a;
char b;
double c;
};
int main()
{
struct str s;//可以将struct str整体理解为一个变量类型
return 0;
}
又例如描述一个人,创建一个“‘人’类型”
struct pep
{
char name[10];//名字
int age;//年龄
char sex[5];//性别
char id[20];//身份证
};
2、结构体的初始化
可以像初始化数组一样初始化一个结构体
struct pep
{
char name[10];//名字
int age;//年龄
char sex[5];//性别
char id[100];//身份证
};
int main()
{
struct pep p = { "limou", 13, "女", "4465667655453625" };
return 0;
}
甚至可以嵌套初始化
struct grade
{
int chinese;
int math;
};
struct pep
{
char name[10];//名字
int age;//年龄
char sex[5];//性别
char id[100];//身份证
struct grade a;
};
int main()
{
struct pep p = { "limou", 13, "女", "4465667655453625", {100, 120} };
return 0;
}
3、结构体成员访问
如果此时我们创建并初始化好一个结构体变量,那么我们应该怎么做才能访问其成员呢?
(1)采用“.”操作符
struct grade
{
int chinese;
int math;
};
struct pep
{
char name[10];//名字
int age;//年龄
char sex[5];//性别
char id[100];//身份证
struct grade a;
};
int main()
{
struct pep p = { "limou", 13, "女", "4465667655453625", {100, 120} };
printf("%s\n", p.name);
printf("%d\n", p.age);
printf("%s\n", p.sex);
printf("%s\n", p.id);
printf("%d\n", p.a.chinese);
printf("%d\n", p.a.math);
return 0;
}
(2)采用“->”操作符
#include <stdio.h>
struct grade
{
int chinese;
int math;
};
struct pep
{
char name[10];//名字
int age;//年龄
char sex[5];//性别
char id[100];//身份证
struct grade a;
};
int main()
{
struct pep p = { "limou", 13, "女", "4465667655453625", {100, 120} };
struct pep* pp = &p;
printf("%s\n", pp->name);
printf("%d\n", pp->age);
printf("%s\n", pp->sex);
printf("%s\n", pp->id);
printf("%d\n", pp->a.chinese);
printf("%d\n", pp->a.math);
return 0;
}
4、结构体传参
结构体传参可以传递整个结构体(这是为了让结构体变量和普通的变量保持同步)或者结构体的地址
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;
}
但如果结构体的大小比较大,一般会使用指针传参会更好(因为省内存,函数在传参的时候,参数是需要压栈的,如果传递一个结构体对象过大,则参数压栈的系统开销会比较大,导致程序性能下降)