十五. 构造数据类型

● 构造数据类型概念

Structured data types 构造数据类型

结构体(structure), 联合体/共用体 (union), 枚举类型(enumeration type), 要有意识这三者是数据类型

Union is also like structure, i.e. collection of different data types which are grouped together. Each element in a structure or a union is called member.

•    Structure allocates storage space for all its members separately.

•    Whereas, Union allocates one common storage space for all its members

● 结构体使用场景

无论是基本数据类型还是数组都仅仅描述了事物某一方面的特性, 但是, 一种事物往往具有多方面的属性, 如一个同学有学号, 姓名, 性别, 年龄等属性.

定义形式:

struct union_type_name

{

member_type        member_name_1;

member_type        member_name_2;

...

member_type        member_name_n;

};

结构体变量的定义 & 结构体成员的初始化, 例如:

struct person_info

{

int index;

char name[30];

short age;

};

person_info Eric, Peter;

struct person_info

{

int index;

char name[30];

short age;

} Eric, Peter;

 

● 结构体成员初始化的两种方法

//结构体变量名.成员名

#include <iostream>

using namespace std;

void main()

{

struct person_info

{

int index;

char name[30];

short age;

};

person_info p_info;        //也可以写成struct person_info p_info;

p_info.index=1;

strcpy(p_info.name,"Jim");    //位字符数组赋值需要使用字符串复制函数strcpy(), 否则会提示: cannot convert from 'char [4]' to 'char [30]'

p_info.age=20;

cout << p_info.index<< endl;

cout << p_info.name << endl;

cout << p_info.age << endl;

cout<<sizeof(person_info)<<endl;

字节, 即4+30+2=36

}

/*

可以在声明一个结构体变量后赋值:

struct person_info

{

int index;

char name[30];

short age;

};

person_info p_info={1,"Jim", 20};

*/

/* 也可以在定义结构体变量时直接对成员赋值:

struct person_info

{

int index;

char name[30];

short age;

} p_info={1,"Jim", 20};*/

//结构体指针变量->成员名

//在定义结构体的同时, 声明结构体指针变量

#include <iostream>

using namespace std;

void main()

{

struct person_struct

{

int index;

char name[30];

short age;

}*p, p_info={1,"Jim",20};

p=&p_info;

cout <<p->index << endl;

cout <<p->name << endl;

cout << p->age << endl;

cout <<(*p).index << endl;

cout <<(*p).name << endl;

cout <<(*p).age << endl;

cout << sizeof(p) << endl;

cout << sizeof(p_info) << endl;

}

//也可以写成:

struct person_info

{

int index;

char name[30];

short age;

};

person_info p_info={1,"Jim",20};

struct person_info *p=&p_info; //一定要写定义的结构体类型名, 不能写成struct *p=&p_info;

总之, 在上述案例中, 访问结构体成员有下面三种方法:

① p_info.index; ② p->index; ③ (*p).index;

② 当一个结构体类型定义完成后, 如果要使用这个类型, 保留字struct在C语言中必须使用,而在C++中则可被省略不写。

● 结构体的嵌套, 子结构体(sub-structure)

#include <iostream>

using namespace std;

void main()

{

struct person_info

{

int index;

char name[30];

short age;

struct work_place

{

char address[150];

char postCode[30];

char gateCode[50];

char street[100];

char area[50];

}WP; //子结构体(sub-structure)

};

person_info p_info;    //p_info是person_info结构体类型变量

strcpy(p_info.WP.address,"House");    //可以把WP看作是p_info变量的子变量(sub-variable)

strcpy(p_info.WP.postCode,"10000");

strcpy(p_info.WP.gateCode,"302");

strcpy(p_info.WP.street,"Lan Tian");

strcpy(p_info.WP.area,"China");

cout << p_info.WP.address << endl;

cout << p_info.WP.postCode << endl;

cout << p_info.WP.gateCode<< endl;

cout << p_info.WP.street << endl;

cout << p_info.WP.area << endl;

}

● 结构体变量作函数参数

#include <iostream>

using namespace std;

struct person_info //定义结构体

{

int index;

char name[30];

short age;

};

void show_stuct_message(struct person_info my_info) //自定义函数,形参是结构体变量my_info, 输出结构体变量成员, 不返回值

{

cout << my_info.index << endl;

cout << my_info.name << endl;

cout << my_info.age<< endl;

}

void main()

{

person_info p_info; //声明结构体变量p_info, 作为形参

p_info.index=1;

strcpy(p_info.name,"Jim");

p_info.age=20;

show_stuct_message(p_info); //调用自定义函数

}

● 结构体指针做函数参数

#include <iostream>

using namespace std;

struct person_info

{

int index;

char name[30];

short age;

};

void show_struct_message(struct person_info *my_info)

{

cout << my_info->index << endl;

cout << my_info->name << endl;

cout << my_info->age<< endl;

}

void main()

{

person_info p_info;

p_info.index=1;

strcpy(p_info.name,"Jim");

p_info.age=20;

show_struct_message(&p_info);

}

● 结构体数组的声明与引用 & 指针访问结构体数组

结构体数组: 每个元素都是结构体变量的数组

//定义结构体数组的一般形式:

struct 结构体名

{

成员列表;

}数组名;

struct Student    //可以把Student这个结构体名省略

{

char name[20];

int number;

char sex;

int grade;

}student[5];

//结构体数组中各数据在内存中的存储是连续的,例如:

#include <iostream>

using namespace std;

void main()

{

struct person_info

{

int index;

char name[30];

short age;

}p_info[5]={{1,"Jim",20},    //p_ifno是一个结构体数组

{2,"Eric",21},

{3,"Peter",22},

{4,"Amy",22},

{5,"Lucy",22}};

struct person_info *p;

p=p_info;    //p_info是一个结构体数组名, 因此就代表一个地址值

for(int i=0;i<5;i++,p++)

{

cout << p->index << endl;

cout << p->name << endl;

cout << p->age << endl;

}

}

● 共用体变量的大小

所有共用体在同一时刻只能有一个值, 它属于某一数据成员, 不过其它成员会共享这个值, 只是会转换成这些成员的数据类型

共用体变量的大小是其最大成员的大小.

联合体使用场景:

例如通信中的数据包会用到共用体, 因为不知道对方会发一个什么数据类型的包过来,用共用体的话就很简单了,定义几种格式的包,收到包之后就可以直接根据包的数据类型取出数据。

定义形式:

union union_type_name

{

member_type        member_name_1;

member_type        member_name_2;

...

member_type        member_name_n;

};

联合体变量的定义, 例如:

//第一种形式:

union my_union

{

int i;

char ch;

float f;

};

my_union u;

//第二种形式:

union my_union

{

int i;

char ch;

float f;

} u;

#include<stdio.h>

union data_union            /*声明共用体类型*/

{

int a;            /*成员变量*/

char b;

};

int main()

{

union data_union my_union;        /*定义共用体变量*/

my_union.a=97;                /*为共用体变量中成员赋值*/

printf("a: %d\n",my_union.a);        /*输出成员变量数据*/

printf("b: %c\n",my_union.b);

my_union.b='A';            /*改变成员的数据*/

printf("a: %d\n",my_union.a);        /*输出成员变量数据*/

printf("b: %c\n",my_union.b);

printf("sizeof(data_union): %d\n",sizeof(data_union));

printf("sizeof(my_union): %d\n",sizeof(my_union));

return 0;

}

● 枚举类型(enumeration type)

使用场景: 很多集合描述的状态为有限几个, 例如比赛结果只有输, 赢和平手三种状态; 一周只有七天等等.

● 枚举类型是一些标识符的集合, 这些标识符代表整型常量. 声明形式:

① 标识符没有被赋值

enum 枚举类型名 {枚举常量1, 枚举常量2,…, 枚举常量n};

enum enumeration_type_name { enumeration_constant_1, enumeration_constant_2, ..., enumeration_constant_n}

例如:

enum weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};

开始的整型常量

② 标识符被赋值

enum enumeration_type_name    //方括号(中括号)内的内容可以写或不写

{

identifier[=integral constant],

identifier[=integral constant],

...

identifier[=integral constant],

};

上面的枚举类型声明相当于:

enum Weekday {Sunday=0, Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6};

也可以自己赋值, 如:

enum Weekday {Sunday=2, Monday=3, Tuesday=4, Wednesday=5, Thursday=0, Friday=1, Saturday=6};

如果只给前几个标识符赋值, 编译器会给后面的标识符自动累加赋值, 例如:

enum Weekday {Sunday=7, Monday=1, Tuesday, Wednesday, Thursday, Friday, Saturday};

相当于:

enum Weekday {Sunday=7, Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6};

● 枚举类型变量(enumeration variable/enum variable)

enum Weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};

Weekday myworkday;

也可以去掉上面花括号后面的分号, 然后直接写变量的标识符:

enum Weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} myworkday;

注意:① 在C语言中, 还需要写关键字, 即: enum weekday myworkday;

② 枚举变量的值只能在Sunday和Saturday之间, 即一个整型数据不能直接赋给一个枚举变量, 不过可以先将一个整型常量强转为Weekday枚举类, 然后再赋值.

● 枚举类型的声明, 枚举类型变量的声明及其运算

#include <iostream>

using namespace std;

void main()

{

enum Weekday {Sunday,Monday,Tuesday,Wednesday,Thresday,Friday,Saturday};

int a=2,b=1;

Weekday day;

day=Tuesday;

cout<<day<<endl;

day=(Weekday)a; //将整型的a强转为Weekday类型

cout << day << endl;

day=(Weekday)(Sunday+Wednesday); //Sunday+Wednesday后得到一个整型常量, 因此也需要强转

cout << day << endl;

个标识符代表的整型常量(从0开始计数)

cout << day << endl;

Weekday another_day;

another_day=Tuesday;

cout<<day-another_day<<endl;

cout<<sizeof(Weekday)<<endl;

cout<<sizeof(another_day)<<endl;

//enum类型的长度以及每个enum类型变量的长度都是一个枚举常量的长度, 即sizeof(int)=4;

}

(C/C++学习笔记) 十五. 构造数据类型的更多相关文章

  1. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  2. (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)

    一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的 ...

  3. Java基础学习笔记十五 集合、迭代器、泛型

    Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都 ...

  4. Objective-C学习笔记(五)——数据类型与限定词

    如同其它不论什么的编程语言一样,想要更深入的学习.必需要了解该门语言的数据类型与限定词. OC的数据类型例如以下: (1)int:整型:   int a;      int b=2;     int ...

  5. MySQL学习笔记十五:优化(2)

    一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...

  6. yii2源码学习笔记(十五)

    这几天有点忙今天好些了,继续上次的module来吧 /** * Returns the directory that contains the controller classes according ...

  7. angular学习笔记(十五)-module里的'服务'

    本篇介绍angular中的模块:module 在笔记(二)http://www.cnblogs.com/liulangmao/p/3711047.html里已经讲到过模块,这篇主要讲模块的 '服务' ...

  8. Java学习笔记十五:Java中的成员变量和局部变量

    Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ...

  9. MYSQL进阶学习笔记十五:MySQL 的账号权限赋予!(视频序号:进阶_33,34)

    知识点十六:MySQL的账号权限赋予(33) 一.MySQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界.比如只允许你执行select操作,那么你就不能执 ...

随机推荐

  1. [BZOJ3613][Heoi2014]南园满地堆轻絮 二分答案

    Description 小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者,最近 他研究起了诗词音律的问题.   在过去,诗词是需要编成曲子唱 ...

  2. Linux CentOS 7 下 JDK 安装与配置

    前言 简单记录一下在CentOS 7中安装配置JDK 1.7的全过程~  ( 安装别的版本或者jre一样) 下载 首先是jdk 1.7 64bit & 32bit的下载地址: jdk-7u79 ...

  3. Facebook广告API系列 1

    Facebook广告API系列 1 前言 最近遇到大坑了,居然要去对接facebook的广告API,之前以为是跟鹅厂一样的API体系,看了半天Facebook的文档,冷汗直冒.... 这得一点一点的讲 ...

  4. BZOJ 1005: [HNOI2008]明明的烦恼(prufer数列)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1005 题意: Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标 ...

  5. Redis集群学习笔记

    Redis集群学习笔记 前言 最近有个需求,就是将一个Redis集群中数据转移到某个单机Redis上. 迁移Redis数据的话,如果是单机Redis,有两种方式: a. 执行redis-cli shu ...

  6. 生信软件的好帮手-bioconda--转载

    http://mp.weixin.qq.com/s/nK1Kkf9lfZStoX25Y7SzHQ 这篇文章主要适用于Linux平台,当然MacOS也行,不过它有更好安装方法. 此外网上也会许多更好的关 ...

  7. SQLServer 大小写转换

    SQLServer中小转大也是同样的默认快捷键,大转小换成L了 1.小写转换大写  Ctrl + shift + U 2.大写转换小写  Ctrl + shift + L

  8. cookie(2)

    转载,原文地址 https://segmentfault.com/a/1190000004743454 一.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那就不得不 ...

  9. [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]

    最短路径—Dijkstra算法和Floyd算法 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算 ...

  10. 技术分享:SSH实战项目

    1.需求分析 系统概述: 企业人事管理系统. 要求对员工信息进行维护. 后台系统先登录,才能操作员工;添加.修改.删除. 没有登录,只能查看列表,不能操作. 功能分类: 1)[管理员模块] 注册/登录 ...