1. 结构体的引入
在前面已经介绍了整形(int,long,···),浮点型(flaot,double),字符型(char),还介绍了数组(存储具有相同类型数据的集合),字符串等。但是在实际问题中仅有这些数据类型是不够的,有时候我们需要好几种类型来描述一个复杂对象,例如一个学生的信息就需要学号(字符串),姓名(字符串),年龄(整形)等等,这些数据类型都不同但是他们又是表示一个整体,要存在联系,那么我们就需要一个新的数据类型—结构体。
2. 结构体的定义
2.1 定义结构体的一般格式
struct 结构名
{
类型 变量名;
类型 变量名;
...
} 结构变量;
例如,一个描述学生信息的结构体:
struct student
{
char no[20]; //学号
char name[20]; //姓名
char sex[5]; //性别
int age; //年龄
}stu[100];
像上面这里,我们就定义了表示100个学生信息的结构体。如果没有结构体,我们可能要用400行代码才能表示完100个学生的信息,这就是结构体的好处。
注意:结构体变量可以写可不写,但是后面的分号不能省略。
2.2 定义结构体的特殊形式
匿名结构体:没有结构名,它只能使用一次,用过一次就不能再使用。
struct
{
类型 变量名;
类型 变量名;
...
} 结构变量;
如下例所示
//代码1
struct
{
char b;
char name[20];
int a;
}x;
//代码2
struct
{
char b;
char name[20];
int a;
}a[10],*p;
不能把变量x的地址放到*p中去。匿名结构体的成员虽然一样,但是在编译器看来,他们的类型是不一样的,所以编译器会报错(不兼容)。
3. 结构体的初始化
在对结构体变量初始化时,要对结构体成员一 一赋值,不能跳过前面成员变量,而直接给后面成员赋初值,但是可以只赋值前面几个,对与后面未赋值的变量,如果是数值型,则会自动赋值为0,对于字符型,会自动赋初值为NULL,即 ’\0’。
3.1 定义时直接赋值
struct student
{
char name[20];
char sex;
int num;
}stu1={"zhangsan",'m',1234};
或者
struct student
{
char name[20];
char sex;
int num;
};
struct student stu1={"zhangsan",'m',1234};
注意:字符为’ ’,字符串为" "。
3.2 定义结构体之后逐个赋值
struct student
{
char name[20];
char sex;
int num;
}stu;
int main()
{
stu.name="zhangsan";
stu.sex='m';
stu.num=1234;
return 0;
}
3.3 定义之后任意赋值
struct student
{
char name[20];
char sex;
int num;
}stu1;
int main()
{
stu1.sex='m';
stu1.num=1234;
stu1.name="zhangsan";
return 0;
}
这样写的好处时不用按照顺序来进行初始化,而且可以对你想要赋值的变量直接进行赋值,而不想赋值的变量可以不用赋值。
注意:如果在定义结构体变量的时候没有初始化,那么后面就不能全部一起初始化了。
4. 结构体成员的访问
结构体成员访问操作符有 "·"和 “->”两种。
//"·"操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//"->"操作符
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps-
>id);