在C语言当中,除了我们常用的几个基本的数据类型之外,还有一种类型叫自定义类型。比如:我们要描述一个学生。这个学生有姓名,性别,年龄,身高等。单独用基本的数据类型是不能完全描述的。这个时候就要使用我们自定义的类型来进行描述。自定义的类型有结构体,枚举和联合体。
一、结构体
结构体时一些值得集合,这些值被称为成员变量,每一个成员变量可以有不同的类型。
1,声明
struct tag//这里的tag表示标签,不是变量名
{
member-list;//成员变量
}variable-list;//变量列表,用来定义变量。注意这里的分号
比如,描述一个人:
struct person
{
char name[20];
char sex[5];
int age;
char nation[20];
};
这里的变量列表可以没有。在变量列表里面定义的变量是全局变量。
2,定义且初始化
要定义,可以直接在变量列表里面,也可以在main函数里面定义。
struct person
{
char name[20];
char sex[5];
int age;
char nation[20];
}person1;//结构体变量person1
struct person person2;//结构体变量person2
int main(void)
{
struct person person3;//结构体变量person3
struct person person4[2];//结构体数组变量person4,有两个元素,都是结构体类型
return 0;
}
要初始化也很简单。
#include<stdio.h>
struct person
{
char name[20];
int age;
}person1 = {"zhangsan", 18};//结构体变量person1
struct person person2 = {"lisi", 18};//结构体变量person2
int main(void)
{
struct person person3 = {"wangwu", 18};//结构体变量person3
struct person person4[2] =
{"abc", 18, {"def", 18}};//加不加{}都可以
return 0;
}
有的时候,结构体还会出现嵌套的情况:
struct person
{
char name[20];
int age;
}person1 = {"zhangsan", 18};//结构体变量person1
struct people
{
struct person person;
char nation[20];
};
对其进行初始化:
struct people people = { {"zhangsan",18}, "XXX" };//嵌套结构体的初始化
我们在声明结构体的时候,也可以不完全声明,这个时候省略掉标签。
struct
{
int a;
char b;
float c;
}a;
有一种情况是不可以省略标签的,即使用typedef关键字的时候。typedef关键字能够为一种数据类型定义一个新名字。如果省略,就会报错。
typedef struct S
{
int data[1000];
int num;
}s;
s s1 = { {1,2,3,4}, 1000 };
3,结构体成员的访问
结构体成员的访问需要通过点(.)操作符来进行访问的。下面我们来打印这几个初始化的变量。
#include<stdio.h>
struct person
{
char name[20];
int age;
}person1 = {"zhangsan", 18};//结构体变量person1
struct people
{
struct person person;
char nation[20];
};
struct person person2 = {"lisi", 18};//结构体变量person2
int main(void)
{
struct person person3 = { "wangwu", 18 };//结构体变量person3
struct person person4[2] =
{"abc", 18, {"def", 18}};//加不加{}都可以
struct people people = { {"zhangsan