昨晚和今早学习讲述的内容是结构
经过老师和B站视频av3425303的教育,我大概对结构有了一点理解
按我理解总结起来就是结构是多个内容的统一体,自己还带了一个名字。
就像山东与中国的关系一样。
先来介绍一下结构体的结构:
struct 标识符//自行确定,相当于变量名
{ 类型 成员1 ;
类型 成员2 ;
…
类型 成员n ;
} ; //最后的这个分号一定不能落下
例如:
struct employee
{ char name [ 10 ] ;
long code ;
double salary ;
char address [ 50 ] ;
char phone [ 20 ] ;
} ;
下面是对结构体更为官方的解释
结构是由不同数据类型的数据组成的集合体。
结构由数目固定的成员构成
各成员可以具有不同的数据类型
一个结构变量在内存占有一片连续的存储空间
值得一提的是最后一条关于结构体的存储
就如数组一样,定义一个数组a[10],只要a[0]确定了地址,这个数组后面的a[1]到a[9]会紧跟着a[0]。也就是说标识符的地址确定了后,其后面的每一个成员的地址都会紧随其后。
在定义一个结构变量的时候,可以声明类型之后声明变量:
struct employee
{ char name [ 10 ] ;
long code ;
double salary ;
char address [ 50 ] ;
char phone [ 20 ] ;
};
employee worker1, worker2, *Emp ;
也可以声明类型的同时声明变量
struct employee
{ char name [ 10 ] ;
long code ;
double salary ;
char address [ 50 ] ;
char phone [ 20 ] ;
}worker1, worker2, *Emp ;
这样下来worker1,worker2就都是两个employee类型的变量了,*Emp是employee类型的指针变量。另外,在说明结构变量的同时可以进行初始化,例如:
employee worker=
{"Wang Datou",918564,100000,"Guang Zhou","857857857857"};
在访问和赋值的时候,结构体也只能单独访问和赋值,访问结构变量成员使用的是圆点运算符:结构变量名.成员
例如:
#include<iostream>
using namespace std;
struct weather // 声明结构类型,写在主函数之前
{ double temp; double wind; } ;
int main ( )
{ weather today ; // 声明结构类型变量
today . temp = 10.5 ; // 对结构变量成员赋值
today . wind = 3.1 ;
cout << “Temp = ” << today . temp << endl ; // 按成员输出
cout << “Wind = ” << today . wind << endl ;
}
也可以用指针访问结构变量的成员 :
结构指针 -> 成员
(*结构指针 ) . 成员
# include <iostream>
# include <cstring>
using namespace std ;
struct person
{ char name[20] ; unsigned long id; double salary; } ;
int main ( )
{ person pr1 ;
person * pp ; // 定义结构指针
pp = & pr1 ; // 取结构变量地址
strcpy ( (pp*).name , “David Marat” ) ; // 对结构成员赋值
(pp*).id=987654321 ;
pp->salary=335.0 ;
cout << pp -> name << ‘\t’ << pp -> id << ‘\t’ << pp -> salary << endl ;
}
结构体数组应用举例:
对候选人得票的统计程序。
设有3个候选人,最终只能有1人当选。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。
#include <iostream>
struct Person//声明结构体类型Person
{
char name[20];
int count;
};
int main( )
{
Person leader[3]={″Li″,0,″Zhang″,0,″Fun″,0};
//定义Person类型的数组,内容为3个候选人的姓名和当前的得票数
int i,j;
char leader_name[20];//leader_name为投票人所选的人的姓名
for(i=0;i<10;i++)
{
cin>>leader_name; //输入10张票上所写的姓名
for(j=0;j<3;j++) //将票上姓名与3个候选人的姓名比较
if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;
//如果与某一候选人的姓名相同,就给他加一票
}
cout<<endl;
for(i=0;i<3;i++) //输出3个候选人的姓名与最后得票数
{
cout<<leader[i].name<<″:″<<leader[i].count<<endl;
}
return 0;
}
在使用结构体的时候有一点值得注意:
一个结构类型的成员可以是另一个已定义的结构类型
例如:
为职工结构添加出生日期信息类型和变量声明为:
struct **date**
{ int month ;
int day ;
int year ;
} ;
struct employee
{ char name [ 10 ] ;
**date birthday ;**
long code ;
double salary ;
char address [ 50 ] ;
char phone [ 11 ] ;
} worker1, worker2 ;
但是结构函数不能自己实现无穷的递归结构,也就是说在结构体内部包含一个类型为该结构的成员这是非法的
struct person
{ char name [ 10 ] ;
long code ;
double salary ;
char address [ 50 ] ;
char phone [ 11 ] ;
person son;//×
} worker1, worker2 ;