一、结构体的声明
1、什么是结构体?
结构体是一组不同或相同类型的值的集合,这些值被称为成员变量,这些成员变量可以是变量、常量、数组、指针、结构体。
2、结构体定义的方式
定义结构体的关键字 结构体标签
{
结构体的成员变量
}结构体变量名;(定义结构体的大括号尾部有个分号,绝对不 能省略。)
定义结构体关键字(struct) + 结构体标签 被称为结构体类型名。
举例:定义一个学生信息的结构体
struct student
{
char name[20];//学生姓名
int age;//学生年龄
char sex[5];//学生性别
}s;
二结构体变量的定义和初始化
1、结构体变量的定义
方法一:
struct student
{
char name[20];//学生姓名
int age;//学生年龄
char sex[5];//学生性别
}s;
声明结构体成员变量后,直接在结尾定义结构体变量s。
方法二:
struct student
{
char name[20];//学生姓名
int age;//学生年龄
char sex[5];//学生性别
};
int main()
{
struct student s;
return 0;
}
声明结构体成员变量后,回到主函数中定义结构体变量s。
2、结构体变量的初始化
初始化也有两种方式:
方法一:
struct student
{
char name[20];//学生姓名
int age;//学生年龄
char sex[5];//学生性别
}s = {"张三", 20, "男"};
在结尾定义的结构体变量直接对其初始化。
方法二:
struct student
{
char name[20];//学生姓名
int age;//学生年龄
char sex[5];//学生性别
};
int main()
{
struct student s = { "张三", 20, "男" };
return 0;
}
在主函数中对定义的结构体变量进行赋值初始化,就如同
int a = 10;直接对变量a进行赋值。
3、结构体的嵌套初始化
struct score
{
float math;
float english;
}w;
struct Student
{
char name[20];//学生姓名
int age;//学生年龄
char sex[5];//学生性别
struct score w;
};
int main()
{
struct Student s = { "张三", 20, "男", {88.5, 85.5} };
return 0;
}
这里可以对一个结构体中嵌套的另一个结构体进行初始化,但当要初始化嵌套的结构体的时候,因为嵌套来的结构体也是结构体,要对其有特殊的说明,所以初始化这种结构体成员的时候,要加上{}。
如果结构体中有指针,有明确指向的话就明确指向那个地址,否则就置为空指针NULL。
三、结构体成员的访问
访问结构体成员需要用到两个操作符:. 和 —>。
1、.访问结构体成员
.操作符需要接收两个操作数:结构体变量名 . 结构体成员
如:
struct score
{
float math;
float english;
}w = {55.5, 88.8};
struct student
{
char name[20];//学生姓名
int age;//学生年龄
char sex[5];//学生性别
struct score w;
}s;
int main()
{
struct student s = { "张三", 20, "男", {88.5, 85.5} };
printf("%s\n%d\n%s\n%.2f %.2f\n", s.name, s.age, s.sex, s.w.math, s.w.english);
return 0;
}
其中s是结构体变量名,是struct student类型结构体的变量,w也是同理,所以可以用s.成员变量(s.name)来访问输出这个成员变量。
当要在本结构体中访问声明的其他结构体变量时,可以先用s.另一个结构体变量名,再.去访问另一个结构体中的成员变量。
2、——>访问结构体成员
——>这个操作符也有两个操作数:指针——>成员变量
如:
如图所示,在主函数中我们创建了一个结构体指针ps,将结构体s的地址存放在ps中,当想访问结构体s中的成员时,使用指针——>成员(等价于(*ps).成员)。当想访问结构体w中的成员时,用指针指向结构体w:ps——>w,因为w是个结构体变量不是地址,所以访问结构体w成员时,直接使用w.成员,结合起来就是ps——>w.成员。
四、结构体传参
结构体传参时可以像函数一样,传值调用和传址调用。
如:
struct score
{
float math;
float english;
}w = {55.5, 88.8};
struct student
{
char name[20];//学生姓名
int age;//学生年龄
char sex[5];//学生性别
struct score w;
};
void test1(struct student* ps)
{
printf("%s\n%d\n%s\n%f %f\n", ps->name, ps->age, ps->sex, ps->w.math, ps->w.english);
}
void test2(struct student s)
{
printf("%s\n%d\n%s\n%.2f %.2f\n", s.name, s.age, s.sex, s.w.math, s.w.english);
}
int main()
{
struct student s = { "张三", 20, "男",{55.5, 88.8} };
struct student* ps = &s;
test1(ps);
test2(s);
return 0;
}
在结构体传参时要传递结构体地址,因为:函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结尾:感谢你能看到这里,如果有写的不对的地方请给位不吝赐教,谢谢啦!