i信息学奥赛

加入QQ群:1025629106,或关注微信公众号:i信息学奥赛,获取更多学习资源。

导航

结构体

Posted on 2021-01-24 19:37  shnoip  阅读(492)  评论(0编辑  收藏  举报

感谢2004郑楚煌整理提供

一、定义
结构体是一种把不同类型的变量打包结合成一个一个变量类型。例如,现在我们要存储多个学生的考试成绩,由姓名(string),学号(int),语文数学英语成绩(可能有小数,所以要用double),如果按照一般方法处理,我们要这样做:

string name[20];
int number[20];
double chinese[20],maths[20],english[20];

这样处理是非常不方便的事情,而且不方便管理。我们就可以把它打包成一个结构体,每一个结构体都可以存储这5种数据。

二、用法
格式如下:
struct 类型名 {
  变量列表;
};

注意最后是要加分号的,不是定义自定义函数那样直接大括号结束的。

例如,上面的例子可以表示为:
struct studentinfo {
  string name;
  int number;
  double chinese,maths,english;
};

以后就可以声明这种类型的变量了。

声明结构体变量的方式:
struct 类型名 变量名

例如:
struct studentinfo student[20];

就可以声明20个studentinfo类型的数据了,并且是一个数组。

三、已知有n个学生,每个学生有一个姓名和成绩,输入n,每个学生的姓名和成绩,输出班级的第一名的姓名和成绩。
分析:这一题把学生姓名和成绩放在一起作为一个结构体会方便管理。

程序实例:
#include<bits/stdc++.h>
using namespace std;
struct studentinfo{
  string name;
  int score;
};
int main() {
  int n;
  cin>>n;
  struct studentinfo stu[n];
  for(int i=0;i<n;i++)
    cin>>stu[i].name>>stu[i].score;
  int first=0;
  string str="";
  for(int i=0;i<n;i++)
    if(stu[i].score>first){
      first=stu[i].score;
      str=stu[i].name;
    }
  cout<<str<<' '<<first<<endl;
  return 0;
}

结构体的每一个成员都可以单独存取,可以用“.”分割开,说明是哪一个变量。例如:stu[i].name就是指stu[i]的name成员变量。

四、结构体指针
1,结构体指针就是指向结构体的指针,其内存地址就是该结构体的第一个元素的地址。

如:
struct studentinfo a;
struct studentinfo *stu;
*stu=&a;

此段代码中stu指针变量指向的就是a。

2,引用
(*stu).name
表示*stu的name成员。注意括号虽然不好看,但是不能省略。
*stu.name相当于:*(stu.name)。