结构体类型
结构体是一种较为复杂但却很灵活的构造型数据类型。一个结构体类型可以由若干个称为成员的(或域)的成分组成。
结构体类型说明
其一般形式:
struct 结构体标识名
{ 类型名1 结构成员名表1;
类型名2 结构成员名表2;
.
类型名n 结构成员名表n;
};
其中struct是关键字,是结构体类型的标志。“结构体标识名”和“结构成员表”都是用户定义的标识符。
注意:结构体说明同样要以分号结尾
举例:
struct date
{int year,month,day;};//其实我不是很喜欢这样写因为我会容易漏掉day后的;
我喜欢这样写,
struct date
{
int year,month,day;
}
结构体类型说明中的“类型名1”——“类型名n”,不仅可以是简单数据类型,也可以是构造类型,也可以是某种结构体类型。
当结构体说明中又包含结构体时,称为结构体的嵌套。ANSI C 标准规定结构体至少允许嵌套15层(并且允许内嵌结构体成员的名字与外层成员的名字相同)。
举例
struct student
{
char name[12];
char sex;
struct date birthday;
float sc[4];
};
举例
struct student
{
char name[12];
char sex;
struct
{
int year;
int month;
int day;
}birthday;
float sc[4];
};
结构体类型的说明只是列出了该结构的组成情况,标志着这种类型的结构“模式”已存在,编译程序并没有因此而分配任何储存空间。真正占有存储空间的仍应是具有相应结构体类型的变量、数组以及动态开辟的存储单元,只有这些“实体”才可以用来存放结构体的数据。因此,在使用结构体变量、数组或指针变量之前,必须先对这些变量、数组或指针变量进行定义。
结构体类型的变量、数组和指针变量的定义
可以用以下四种方式定义结构体类型的变量、数组和指针变量:
- 紧跟在结构体结构体类型说明之后进行定义,例如:
struct student
{
char name[12];
char sex;
struct date birthday;
float sc[4];
}std,pers[3],*pstd;
此处在说明结构体类型struct student 的同时,定义了一个结构体变量std、具有3个元素的结构体数组pers和基类型为结构体类型的指针变量pstd。
- 在说明一个无名结构体类型的同时,直接进行定义,例如:(以上定义的结构体中可以把student 略去)
struct
{
...
}std,pers[3],*pstd;
- 先说明结构体类型,再单独进行变量定义。例如:
struct student
{
...
};
struct student std,pers[3],*pstd;
注意:作为构造类型,属于struct类型的结构体可以有任意多种具体的"模式"因此struct必须与结构体标识名共同说明不同的结构体类型,此外,不能只写结构体标识名而省掉struct。
- 使用typedef 说明一个结构体类型名,再用新类型名来定义变量。例如:
typedef struct
{
char ame [12];
char sex;
struct date birthday;
float sc[4]
}STREC;
STREC std,pers[3],*pstd;
STREC是一个具体的结构体类型名,它能够唯一地识别这种结构体类型
可用它来定义变量,不可再写关键字struct。
//举例
//统计男女生人数
#include<stdio.h>
#include<string.h>
struct student//结构体,把这个看成数据类型
{
int sno;
char name[20];
char sex;
int age;
};
int main()
{
struct student s[100];
int n;
printf("请输入需记录的学生人数:\n");
scanf("%d",&n);
for(int i = 0;i < n; i++)
{
printf("\n学号:");
scanf("%d",&s[i].sno);
fflush(stdin);//清空缓存区
printf("姓名:");
gets(s[i].name);
printf("性别(女生请输入F,男生请输入M):");
s[i].sex=getchar();
printf("年龄:");
scanf("%d",&s[i].age);
}
int female = 0;
int male = 0;
for(int i = 0;i < n;i++)
{
if(s[i].sex == 'F')
{
female ++;
}
if(s[i].sex == 'M')
{
male ++;
}
}
printf("\n女生人数(female):%d",female);
printf("\n男生人数(male): %d",male);
return 0;
}