结构体和数组一样,都是一群数据的集合,不同的是数组当中的数据是相同的类型,但是结构体中的数据类型可以不相同,结构体里的成员叫做成员变量
结构体类型是C语言里面的一种自定义类型,我们前面已经了解到过int,char,float,double等数据类型,结构体也是一种数据类型,而且是使用者自己定义的数据类型,用法如下:
1.结构体类型的声明
struct stu
{char name[20];int age;char sex;
};
2.结构体变量的创建和初始化
结构体变量.结构体成员------对应的参数进行打印
struct stu
{char name[20];int age;char sex;
};struct stu t={"小明",15,"男"};
struct stu
{char name[20];int age;char sex;
}s1={"小明",15,"男"};
//这种是在声明结构体同时定义变量
//也可以额外定义struct stu s1={"小明",15,"男"};struct stu s1={.name="小明",.age=15,.sex="男"};//这种可以不按照顺序
3.结构体传参
#include<stdio.h>
struct s
{int num;
};struct s t = 100;
void print1(struct s t)
{printf("%d\n", t.num);
}void print2(struct s *p)
{printf("%d\n", p->num);
}int main()
{print1(t);print2(&t);return 0;
}
这里给出了传值,传地址两种方式,当参数较大时候,传参时候压栈会使得系统在时间空间的开销过大,所以尽量使用传地址的形式;
4.结构的自引用
一个结构体里面不能够包含一个相同的结构体,但是我们可以使用结构体指针,线性数据结构包括顺序表和链表,顺序表就是按照一定的顺序依次排列的结构,链表就是像链子一样串连起来的结构,链表包括数据域和指针域,数据域用来储存相应的数据,指针域便于找到下一个数据;
struct Node
{int time;struct Node* next;
};
//这种引用的方法是正确的,如果不使用指针,我们无法计算结构体的大小,所以们我们用结构体指针
typedef struct
{int time;Node* next;
}Node;
//这个是对匿名结构体的重新命名,这种写法是错误的因为Node没有定义就是用了Node*