一、定义:
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
声明一个结构体类型的形式是:
structstudent //声明一个结构体类型student
{
intnum; //声明一个×××变量num
charname[20]; //声明一个字符型数组name
charsex; //声明一个字符型变量sex
intage; //声明一个×××变量age
floatscore; //声明一个单精度浮点型变量score
}
二、结构体类型变量的定义方法及初始化
1、定义结构体变量的方法:
(1)先声明结构体类型再定义变量名
#include <iostream>
using namespace std;
int main()
{
struct Student //声明一个结构体类型student
{
intnum; //声明一个×××变量num
charname[20]; //声明一个字符型数组name
charsex; //声明一个字符型变量sex
intage; //声明一个×××变量age
floatscore; //声明一个单精度浮点型变量score
}; //要记得这儿的这个分号一定要有,否则会显示student1 和student2 undeclared identifier
Student student1,student2; //定义结构体变量类型student1和student2
cout<<sizeof(Student)<<endl;
cout<<sizeof(student1)<<endl;
cout<<sizeof(student2)<<endl;
return 0;
}
运行结果:36
36
36
Press any key to continue
注:在定义了结构体变量之后,系统会为之分配内存单元。(可以用sizeof函数查看分配的字节数,不同的编译系统存在差异,本文中的所有运行结果都是在VC6.0下的)
(2)在声明类型的同时定义变量
#include<iostream>
usingnamespace std;
int main()
{
structStudent //声明一个结构体类型student
{
int num; //声明一个×××变量num
char name[20]; //声明一个字符型数组name
char sex; //声明一个字符型变量sex
int age; //声明一个×××变量age
float score; //声明一个单精度浮点型变量score
}student1,student2; //定义结构体变量类型student1和student2
cout<<sizeof(Student)<<endl;
cout<<sizeof(student1)<<endl;
cout<<sizeof(student2)<<endl;
return 0;
}
运行结果:如(1)
(3)直接定义结构体类型变量
#include <iostream>
using namespace std;
int main()
{
struct
{
int num; //声明一个×××变量num
charname[20]; //声明一个字符型数组name
charsex; //声明一个字符型变量sex
int age; //声明一个×××变量age
float score;//声明一个单精度浮点型变量score
}student1,student2;//定义结构体变量类型student1和student2
cout<<sizeof(student1)<<endl;
cout<<sizeof(student2)<<endl;
return 0;
}
运行结果36
36
Press any key to continue
注:这种定义方法虽然合法,但是不常用。比较常用的是第一种方法。
关于结构体的类型要注意的几点:
(1)类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。
(2)对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于同类型的普通变量。
(3)结构体的成员也可以是一个结构体变量。
#include <iostream>
using namespace std;
structDate //声明一个结构体变量Date
{
intyear; //日期中的年份
intmonth; //日期中的月份
intday; //日期中的天
};//注意此处的分号必须是在英文字符的输入状态下的!!
struct Student
{
intnum; //声明一个×××变量num
charname[20]; //声明一个字符型数组name
charsex; //声明一个字符型变量sex
intage; //声明一个×××变量age
floatscore; //声明一个单精度浮点型变量score
}; //注意此处的分号一定要在英文字符的输入状态下输入的!!
int main()
{
Studentchengd;
Dateriqi;
cout<<sizeof(chengd)<<endl;
cout<<sizeof(riqi)<<endl;
return 0;
}
运行结果:36
12
Press any key to continue
(5)结构体中的成员名可以与程序中的变量名相同,但二者没有关系。
例如,程序中可以另定义一个×××变量,他与student中的num是两回事,互不影响。
2 结构体变量的初始化
(1)在定义结构体时对结构体变量指定初始值
#include <iostream>
using namespace std;
struct Student
{
intnum; //声明一个×××变量num
charname[20]; //声明一个字符型数组name
charsex; //声明一个字符型变量sex
intage; //声明一个×××变量age
floatscore; //声明一个单精度浮点型变量score
}student={10000,"chengd","man",19,"100"};
(2)在定义变量时进行初始化(这种方法更常用)
#include <iostream>
using namespace std;
struct Student
{
intnum; //声明一个×××变量num
charname[20]; //声明一个字符型数组name
charsex; //声明一个字符型变量sex
intage; //声明一个×××变量age
floatscore; //声明一个单精度浮点型变量score
};
Studentstudent={10000,"chengd","man",19,"100"};
3、结构体变量的引用
在定义了结构体变量之后,就可以引用这个变量。
(1)引用结构体变量中的一个成员的值
引用方式:结构体变量名.成员名
其中“.”是成员运算符,它在所有的运算符中优先级最高。
#include <iostream>
using namespace std;
struct Date
{
intyear;
intmonth;
intday;
};
struct Student
{
intnum; //声明一个×××变量num
charname[20]; //声明一个字符型数组name
charsex; //声明一个字符型变量sex
Datebirthday; //Date 是结构体类型,birthday是Date的类型的变量
floatscore; //声明一个单精度浮点型变量score
};
intmain()
{
StudentA={001,"chengd",'m',1994,11,11,100};
cout<<A.num<<endl;
cout<<A.name<<endl;
cout<<A.sex<<endl;
cout<<A.birthday.year<<'/'<<A.birthday.month<<'/'<<A.birthday.day<<endl;
cout<<A.score<<endl;
return0;
}运行结果:1
chengd
m
1994/11/11
100
如果一个成员本身也是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。
例如:cout<<A.birthday.month<<"/"<<A.birthday.day<<"/"<<A.birthday.year<<endl;
(2)可以将一个结构体变量的值付给另外一个具有形同机构的结构体变量。
#include<iostream>
using namespace std;
struct Date{ //声明一个结构体类型Date
int month; //日期中的月份
int day; //日期中的天
int year; //日期中的年份
};
struct Student{ //声明一个结构体类型Student
int num; //声明一个×××变量num
char name[20]; //声明一个字符型数组name
char sex; //声明一个字符型变量sex
int age; //声明一个×××变量age
Date birthday; //Date是结构体类型,birthday是Date的类型的变量
float score; //声明一个单精度型变量
char addr[30]; //声明一个字符型数组addr
};
int main(){
Student two={1,"qianshou",'m',19,10,01,1993,100,"JiNan"};
Student one=two;
cout<<one.num<<endl;
cout<<one.name<<endl;
cout<<one.sex<<endl;
cout<<one.age<<endl;
cout<<one.birthday.month<<"/"<<one.birthday.day<<"/"<<one.birthday.year<<endl;
cout<<one.score<<endl;
cout<<one.addr<<endl;
return 0;
}
(3)可以引用结构体变量的地址,也可以引用结构体变量成员的地址。
#include<iostream>
using namespace std;
struct Date{ //声明一个结构体类型Date
int month; //日期中的月份
int day; //日期中的天
int year; //日期中的年份
};
struct Student{ //声明一个结构体类型Student
int num; //声明一个×××变量num
char name[20]; //声明一个字符型数组name
char sex; //声明一个字符型变量sex
int age; //声明一个×××变量age
Date birthday; //Date是结构体类型,birthday是Date的类型的变量
float score; //声明一个单精度型变量
char addr[30]; //声明一个字符型数组addr
};
int main(){
Studenttwo={1,"qianshou",'m',19,10,01,1993,100,"JiNan"};
Student &one=two; //引用结构体变量的地址
one.num++;
one.birthday.day+=10;
cout<<two.num<<endl;
cout<<two.name<<endl;
cout<<two.sex<<endl;
cout<<two.age<<endl;
cout<<two.birthday.month<<"/"<<two.birthday.day<<"/"<<two.birthday.year<<endl;
cout<<two.score<<endl;
cout<<two.addr<<endl;
return 0;
}
运行结果:
2
Qianshou
M
19’10/11/1993
100
Jinan
一个小实例:
#include<iostream>
using namespace std;
struct Date{ //声明一个结构体类型Date
int month; //日期中的月份
int day; //日期中的天
int year; //日期中的年份
};
struct Student{ //声明一个结构体类型Student
int num; //声明一个×××变量num
char name[20]; //声明一个字符型数组name
char sex[5]; //声明一个字符型变量sex
int age; //声明一个×××变量age
Date birthday; //Date是结构体类型,birthday是Date的类型的变量
float score; //声明一个单精度型变量
char addr[30]; //声明一个字符型数组addr
};
int main(){
Student one;
//输入信息
cout<<"请输入学号:";
cin>>one.num;
cout<<"请输入姓名:";
cin>>one.name;
cout<<"请输入性别:";
cin>>one.sex;
cout<<"请输入年龄:";
cin>>one.age;
cout<<"请输入生日的年月日:";
cin>>one.birthday.year;
cin>>one.birthday.month;
cin>>one.birthday.day;
cout<<"请输入你的成绩:";
cin>>one.score;
cout<<"请输入地址:";
cin>>one.addr;
//输出信息
cout<<"\n以下是你的信息\n";
cout<<"学号:"<<one.num<<endl;
cout<<"姓名:"<<one.name<<endl;
cout<<"性别:"<<one.sex<<endl;
cout<<"年龄:"<<one.age<<endl;
cout<<"生日:"<<one.birthday.year<<"/"<<one.birthday.month<<"/"<<one.birthday.day<<endl;
cout<<"成绩:"<<one.score<<endl;
cout<<"地址:"<<one.addr<<endl;
return 0;
}