结构体详解
1.1结构体是什么?
结构体是一些值的集合,这些值成为成员变量,结构体的每个成员可以是不同类型的变量。
数组是相同类型的元素组成的集合,结构体可以是不同类型元素组成的集合。
1.2结构体的声明
1.2.1常规声明
struct tag		//tag:结构体名称
{
	member list;//成员列表,可以有一个或者多个
}variable list;//变量列表。可以有一个或多个
struct dog			//声明:狗类型的结构体
{	
	char type[20];	//狗的品种
	char name[10];	//狗的名字
	char sex[2];	//狗的性别
	int age;		//狗的年龄
}dog1,dog2,dog3;	//定义狗类型的结构体变量。也可以不定义(全局变量)1.2.2别名声明
typedef :为复杂的结构体声明定义一个简单的别名
typedef struct Students	//声明学生类型的结构体
{
	//成员变量:是用来描述结构体对象的相关属性的
	char name[20];		//姓名
	long long stuid;	//学号
	char sex[2];		//性别
	int age;			//年龄
}stu;					//创建别名:stu是Students的别名1.2.3两种声明的区别

为结构体创建别名后,可以更加方便的定义该类型的结构体变量
1.3结构体成员的类型
结构体的成员可以是标量、数组、指针、甚至可以是其他结构体
1.4结构体变量的定义及初始化


1.5结构体的访问
在基础篇-操作符有提到过

1.5.1

#include<stdio.h>
struct dog			//声明:狗类型的结构体
{	
	char type[20];	//狗的品种
	char name[10];	//狗的名字
	char sex[5];	//狗的性别
	int age;		//狗的年龄
}dog1={"边牧","牧汪汪","公",2};	//定义狗类型的结构体变量。并初始化
typedef struct Students	//声明学生类型的结构体
{
	//成员变量:是用来描述结构体对象的相关属性的
	char name[20];		//姓名
	long long stuid;	//学号
	char sex[5];		//性别
	int age;			//年龄
	struct dog studog;	//学生的狗
}stu;					//创建别名:stu是Students的别名
int main() {
	stu s1 = { "小明",20200613,"男",15,{"拉布拉多","拉汪汪","母",3}};
	printf("学生结构体s1的名字是:%s,他的狗叫:%s,今年%d岁了,是一只%s狗",s1.name,s1.studog.name,s1.studog.age,s1.studog.sex );
	return 0;
}

1.5.2


1.6结构体传参

函数传参时,参数是需要压栈的。
值传递是将原本的值复制一份在内存中,若是该参数占用的内存较大的话,则会占用更多的内存空间,拷贝的过程也会消耗较多的时间。
而址传递是将其地址传递过去,占用的空间为4或8个字节,系统开销会较小一些,效率也会更高一些。
通常来说结构体会比较大一些,所以结构体传参时,建议使用址传递。




















