目录
1、定义:
在学习结构体变量之前,我们所用的变量大多是互相独立、无内在联系的。为了满足编程时变量逻辑上存在一定关系的需要,C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体。在其他一些高级语言中称为“记录”(record)。
例如:
struct Student //结构体类型名
{int num; //学号为字符串
char name[20]; //姓名为字符串
char sex; //性别为字符型
int age; //年龄为整型
float score; //成绩为实型
char addr[30]; //地址为字符串
}; //注意最后的分号
2、声明一个结构体类型的一般形式为:
struct 结构体名
{ 成员表列 };
3、性质:
1)结构体类型的名字并非只有一种,如除了struct Student结构体类型以外,还可以根据需要建立名为struct Teacher,struct Worker和struct Date等结构体类型,各自包含不同的成员。
2)成员可以属于另一个结构体类型,例如:
struct Date struct Student
{ int month; { int num;
int day; char name[20];
int year; char sex;
}; int age;
struct Date birthday;//成员birthday属于struct Date类型
char addr[30];
};
4、定义一个结构体类型变量的三种方法
1)先声明结构体类型,再定义该类型的变量
struct Student student1,student2;
这种方式是声明类型和定义变量分离,在声明类型后可以随时定义变量,比较灵活。
定义了结构体变量后,系统会为之分配内存单元。
2)在声明类型的同时定义变量
struct Student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
} student1,student2;
声明类型和定义变量放在一起进行,能直接看到结构体的结构,比较直观,在写小程序时此方式比较方便,但写大程序时不推荐使用这种定义方式,以使程序结构清晰,便于维护。
3)不指定类型名而直接定义结构体类型变量
struct
{ 成员表列
} 变量名表列;
不出现结构体名,显然 不能再以此结构体类型去定义其他变量。这种方式用得不多。
5、初始化和引用
1、例:
#include<stdio.h>
int main()
{
struct Student
{
long int num;
char name[20];
char sex;
char addr[20];
}a = { 10101,"Lilei",'M',"123 Beijing Road" };
printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n", a.num, a.name, a.sex, a.addr);
return 0;
}
运行结果:
2、在定义结构体变量时可以对它得成员初始化。初始化列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的各成员。
C99标准允许对某一成员初始化,如
struct Student b={.name="Zhang Fang"};
“.name”隐含代表结构体变量b中的成员b.name。其他未被指定初始化的数值型成员被系统初始化为0,字符型成员被系统初始化为'\0',指针型成员被系统初始化为NULL。
3、可以引用结构体变量中成员的值,引用方式为
结构体变量名.成员名
如student1.num成员就是结构体变量student1中的num成员,在程序中可以对变量的成员赋值,例如:
student1.num=10010;
"."是成员运算符,它在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看待,相当于一个变量。
注意,以下用法不正确:
printf("%s\n",student1);
//不能企图通过输出输出结构体变量名来达到输出结构体变量所有成员的值
4、只能对最低级成员进行赋值或存取以及运算。如果.后的成员本身又属于一个结构体类型,则要用若干个成员运算符,直到输出最低一级的成员。
像上面举的成员可以属于另一结构体类型的例子,引用成员的方式为,
student1.birthday.month;
//student1中的成员birthday中的成员month
5、结构体变量的成员可以像普通变量一样进行各种运算(根据其类型可以决定的运算)。
例如:
student2.score=student1.score; //赋值
sum=student1.score+student2.score; //加法
student1.age++; //自加
6、同类的结构体变量可以相互赋值,如:
student1=student2;
7、可以引用结构体变量成员的地址,也可以引用结构体变量的地址;
scanf("%d",&student1.num);//输入student1.num的值
printf("%o",&student1); //输出结构体变量student1的起始地址
不能试图用一个scanf语句整体读入结构体变量。