一、结构体的声明

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、——>访问结构体成员

——>这个操作符也有两个操作数:指针——>成员变量

如:

结构体初阶_成员变量_02

如图所示,在主函数中我们创建了一个结构体指针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;
}

      在结构体传参时要传递结构体地址,因为:函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

结尾:感谢你能看到这里,如果有写的不对的地方请给位不吝赐教,谢谢啦!

结构体初阶_初始化_03