华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1113|回复: 1
打印 上一主题 下一主题

C++中结构体的定义、初始化和引用

[复制链接]

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
跳转到指定楼层
楼主
发表于 2017-10-18 15:13:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 diggersun 于 2017-10-18 15:25 编辑

信息学奥赛中常常会用到一些复杂的变量表示法,比如表示一个学生可能会有学号,姓名,语文数学英语成绩等好几个数据,在导弹飞机这个题中也会用到高度H,长度L,爸爸F等基本变量来表示一个节点的状态,这样的数据表示法最好是使用结构体或者类。一般来说,前者的通用性比较好。
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
声明一个结构体类型的形式是:
struct Student{      //声明一个结构体类型Student
int num;              //声明一个整形变量num
char name[20];   //声明一个字符型数组name
char sex;           //声明一个字符型变量sex
int age;             //声明一个整形变量age
float score;       //声明一个单精度型变量
char addr[30];   //声明一个字符型数组addr
}

结构体类型变量的定义方法及初始化
三种方法:
(1)先声明结构体类型再定义变量名
#include<iostream>
using namespace std;
int main(){
struct Student{      //声明一个结构体类型Student
  int num;         //声明一个整形变量num
  char name[20];   //声明一个字符型数组name
  char sex;        //声明一个字符型变量sex
  int age;         //声明一个整形变量age
  float score;     //声明一个单精度型变量
     char addr[30];   //声明一个字符型数组addr
   };
   Student student1,student2;// 定义结构体类型变量student1和student2
   cout<<sizeof(Student)<<endl;
   cout<<sizeof(student1)<<endl;
   cout<<sizeof(student2)<<endl;     
   return 0;
}
在定义了结构体变量之后,系统会为之分配内存单元。(可以用sizeof函数查看分配的字节数,不同的编译系统存在差异)
(2)在声明类型的同时定义变量
#include<iostream>
using namespace std;
int main(){
struct Student{      //声明一个结构体类型Student
  int num;         //声明一个整形变量num
  char name[20];   //声明一个字符型数组name
  char sex;        //声明一个字符型变量sex
  int age;         //声明一个整形变量age
  float score;     //声明一个单精度型变量
     char addr[30];   //声明一个字符型数组addr
   }student1,student2;//声明变量student1和student2
   cout<<sizeof(Student)<<endl;
   cout<<sizeof(student1)<<endl;
   cout<<sizeof(student2)<<endl;     
   return 0;
}

(3)直接定义结构体类型变量
#include<iostream>
using namespace std;
int main(){
struct {      //声明一个结构体类型Student
  int num;         //声明一个整形变量num
  char name[20];   //声明一个字符型数组name
  char sex;        //声明一个字符型变量sex
  int age;         //声明一个整形变量age
  float score;     //声明一个单精度型变量
     char addr[30];   //声明一个字符型数组addr
   }student1,student2;//声明变量student1和student2
   cout<<sizeof(student1)<<endl;
   cout<<sizeof(student2)<<endl;     
   return 0;
}

这种定义方法虽然合法,但是不常用。比较常用的是第一二种方法。
关于结构体的类型要注意的几点:
(1)类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。
(2)对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于同类型的普通变量。
(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(){
   Student qianshou;
   Date     riqi;
   cout<<sizeof(riqi)<<endl;
   cout<<sizeof(qianshou)<<endl;  
   return 0;
}

(5)结构体中的成员名可以与程序中的变量名相同,但二者没有关系。
例如,程序中可以另定义一个整形变量,他与student中的num是两回事,互不影响。
2 结构体变量的初始化
(1)在定义结构体时对结构体变量指定初始值

struct Student{      //声明一个结构体类型Student
  int num;         //声明一个整形变量num
  char name[20];   //声明一个字符型数组name
  char sex;        //声明一个字符型变量sex
  int age;         //声明一个整形变量age
  float score;     //声明一个单精度型变量
  char addr[30];   //声明一个字符型数组addr
   } student1={10001,"qianshou",'m',19,"100","JiNan" };

(2)在定义变量时进行初始化(这种方法更常用)

struct Student{      //声明一个结构体类型Student
  int num;         //声明一个整形变量num
  char name[20];   //声明一个字符型数组name
  char sex;        //声明一个字符型变量sex
  int age;         //声明一个整形变量age
  float score;     //声明一个单精度型变量
     char addr[30];   //声明一个字符型数组addr
   };
    Student student1={10001,"qianshou",'m',19,"100","JiNan" };

结构体变量的引用
在定义了结构体变量之后,就可以引用这个变量。
(1)引用结构体变量中的一个成员的值
引用方式:结构体变量名.成员名 其中“.”是成员运算符,它在所有的运算符中优先级最高。

#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 one={001,"qianshou",'m',19,10,1,1993,100,"JiNan"};
   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;
}
如果一个成员本社也是一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。
例如: cout<<one.birthday.month<<"/"<<one.birthday.day<<"/"<<one.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(){
   Student two={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;
}


回复

使用道具 举报

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
沙发
 楼主| 发表于 2017-10-18 15:29:37 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-5 02:12 , Processed in 0.147694 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表