结构型是一种自定义数据类型,与基本数据类型如int的作用相同,用于定义变量。数组是一种数据结构,用于组织数据,也是一组变量,有整型数组,有某种结构型数组。类型是一类数据(或存储单元)的抽象,变量是具体的某类存储单元的标识。结构型变量与数组才有可比性。
基本数据类型是一类数的抽象,如整型是整数的抽象,而结构型是一类对象的抽象,如表示学生的结构型。与整数相比,学生具有多种属性,如姓名、性别、出生日期、英语成绩等等。抽象学生的结构型可定义为:
struct Student
{
char name[10];
int sex; //1为男0为女
int year;
int month;
int day;
float grade;//英语成绩
};
有了名为学生的结构型后,需存储两个学生的信息时,他们的信息可保存在两个相关的结构型变量中。语句struct Student zhang3;定义了一个结构型变量zhang3,实际上定义了6个变量:长度为10的字符型数组zhang3.name,整型变量zhang3.sex、zhang3.year、zhang3.month、zhang3.day,单精度变量zhang3.grade。
定义一个数组变量也定义了多个变量,但这些变量的类型相同,而结构型变量的多个成员变量类型可以不同。
使用结构型变量实际上就是使用其多个“普通”的成员变量,如下面程序所示。
#include <stdio.h>
struct Student
{
char name[10];
int sex; //1为男0为女
int year;
int month;
int day;
float grade;//英语成绩
};
#include <stdio.h>
int main()
{
struct Student zhang3;
printf("请输入张三的信息\n");
scanf("%s", zhang3.name);
scanf("%d", &zhang3.sex);
scanf("%d%d%d", &zhang3.year, &zhang3.month, &zhang3.day);
scanf("%f", &zhang3.grade);
printf("张三的信息:\n");
printf("姓名:%s\n", zhang3.name);
printf("性别:%s\n", zhang3.sex==1 ? "男" : "女");
printf("出生日期:%d年%d月%d日\n", zhang3.year, zhang3.month, zhang3.day);
printf("英语成绩:%.1f\n", zhang3.grade);
return 0;
}
程序的执行情况如下:
请输入张三的信息
Zhang3 1 2000 1 1 93.9
张三的信息:
姓名:Zhang3
性别:男
出生日期:2000年1月1日
英语成绩:93.9
可以定义结构型数组,如语句struct Student stu[2];就定义了一个名为stu的结构型数组,实际上也就是定义了两个名为stu[0]和stu[1]结构型变量,不过,每个结构型变量又包含了多个“普通”的成员变量,即对于结构型变量stu[0],应理解为多个“普通”的变量,如长度为10的字符型数组stu[0].name(下标操作符和成员操作符的优先级相同,左结合)……。
也可以用间接引用的方式通过指针使用相关的存储单元。语句struct Student *pStu;就定义了一个结构型指针变量,通过赋值操作使其指向某个存储单元,如pStu=&zhang3;,则*pStu与zhang3标识了同一个存储单元,两者可以互换使用。通过指针变量使用结构型的成员变量需用(*pStu).name(间接引用操作符的优先级比成员操作符的低,故不能省略括号),但常用pStu->name的形式。
结构型变量用于存储具有多个属性的对象,使用结构型变量就是使用其多个“普通”的成员变量。
(练习结构型数组和结构型指针的用法)
基本数据类型是一类数的抽象,如整型是整数的抽象,而结构型是一类对象的抽象,如表示学生的结构型。与整数相比,学生具有多种属性,如姓名、性别、出生日期、英语成绩等等。抽象学生的结构型可定义为:
struct Student
{
char name[10];
int sex; //1为男0为女
int year;
int month;
int day;
float grade;//英语成绩
};
有了名为学生的结构型后,需存储两个学生的信息时,他们的信息可保存在两个相关的结构型变量中。语句struct Student zhang3;定义了一个结构型变量zhang3,实际上定义了6个变量:长度为10的字符型数组zhang3.name,整型变量zhang3.sex、zhang3.year、zhang3.month、zhang3.day,单精度变量zhang3.grade。
定义一个数组变量也定义了多个变量,但这些变量的类型相同,而结构型变量的多个成员变量类型可以不同。
使用结构型变量实际上就是使用其多个“普通”的成员变量,如下面程序所示。
#include <stdio.h>
struct Student
{
char name[10];
int sex; //1为男0为女
int year;
int month;
int day;
float grade;//英语成绩
};
#include <stdio.h>
int main()
{
struct Student zhang3;
printf("请输入张三的信息\n");
scanf("%s", zhang3.name);
scanf("%d", &zhang3.sex);
scanf("%d%d%d", &zhang3.year, &zhang3.month, &zhang3.day);
scanf("%f", &zhang3.grade);
printf("张三的信息:\n");
printf("姓名:%s\n", zhang3.name);
printf("性别:%s\n", zhang3.sex==1 ? "男" : "女");
printf("出生日期:%d年%d月%d日\n", zhang3.year, zhang3.month, zhang3.day);
printf("英语成绩:%.1f\n", zhang3.grade);
return 0;
}
程序的执行情况如下:
请输入张三的信息
Zhang3 1 2000 1 1 93.9
张三的信息:
姓名:Zhang3
性别:男
出生日期:2000年1月1日
英语成绩:93.9
可以定义结构型数组,如语句struct Student stu[2];就定义了一个名为stu的结构型数组,实际上也就是定义了两个名为stu[0]和stu[1]结构型变量,不过,每个结构型变量又包含了多个“普通”的成员变量,即对于结构型变量stu[0],应理解为多个“普通”的变量,如长度为10的字符型数组stu[0].name(下标操作符和成员操作符的优先级相同,左结合)……。
也可以用间接引用的方式通过指针使用相关的存储单元。语句struct Student *pStu;就定义了一个结构型指针变量,通过赋值操作使其指向某个存储单元,如pStu=&zhang3;,则*pStu与zhang3标识了同一个存储单元,两者可以互换使用。通过指针变量使用结构型的成员变量需用(*pStu).name(间接引用操作符的优先级比成员操作符的低,故不能省略括号),但常用pStu->name的形式。
结构型变量用于存储具有多个属性的对象,使用结构型变量就是使用其多个“普通”的成员变量。
(练习结构型数组和结构型指针的用法)