结构体详解
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个字节,系统开销会较小一些,效率也会更高一些。
通常来说结构体会比较大一些,所以结构体传参时,建议使用址传递。