后台开发:核心技术与应用实践1.6.1 结构体、共用体、枚举的概念

1.6 结构体、公用体、枚举


1.6.1 结构体、共用体、枚举的概念


1.?结构体的声明方法

结构体的声明方法如下所示:

struct 结构名{

    数据类型 成员名;

    数据类型 成员名;

    ...

};

成员表由若干成员组成,每个成员都是该结构的一个组成部分,对每个成员也必须做类型声明。例1.11说明了结构体的使用方法。

【例1.11】 结构体使用范例。

#include<iostream>

#include<string.h>

using namespace
std;

struct student{              // 声明一个结构体类型student

    int num;

    char name[20];

    int age;

};                          // 最后有一个分号

int main(){

    struct student stu1;        // 定义一个student类型的变量stu1

    student stu2;                // 定义时也可以不用struct

    stu1.num=1;                //
单独对st1的num元素赋值

    char temp[20]="Xiao ming";

    strncpy(stu1.name,temp,strlen(temp));

    stu1.age=10;

    cout<<stu1.num<<"
"<<stu1.name<<" "<<stu1.age<<endl;

    student *stu3=&stu1;          // stu3是结构体的指针,指向stu1

    (*stu3).num=2;       // stu1的num值被修改成了2;

    cout<<stu1.num<<"
"<<stu1.name<<" "<<stu1.age<<endl;

    return 0;

}

程序的执行结果是:

1 Xiao ming 10

2 Xiao ming 10

例1.11中声明了一个结构体类型student,定义了两个student类型的变量stu1和stu2,分别用了两种定义方法,分别是前面有struct关键字和没有struct关键字。这两种定义方法都是可以的,显然没struct关键字的使用更为方便。

引用结构体变量中成员的一般方式为:

结构体变量名.成员名

例1.11中,stu1.num表示结构体变量stu1中的成员数量的值。

指针也可以应用于结构体,例1.11中stu3就是一个结构体变量,指向stu1。

2.?共用体

共用体,用关键字union来定义,它是一种特殊的类。在一个共用体里可以定义多种不同的数据类型,这些数据共享一段内存,在不同的时间里保存不同的数据类型和长度的变量,以达到节省空间的目的。但同一时间只能储存其中一个成员变量的值。

共用体的声明方式为:

union 共用体类型名{

    数据类型 成员名;

    数据类型 成员名;

    ...

}变量名;

可以使用union判断系统是big endian(大端)还是little endian(小端)。

【例1.12】 判断系统是big endian还是little endian。

#include<iostream>

using namespace
std;

union TEST{

    short a;

    char b[sizeof(short)];

};

int main(){

    TEST test;

    test.a=0x0102;// 不能引用共用体变量,只能引用共用体变量中的成员。

   
if(test.b[0]==0x01&&test.b[1]==0x02){

        cout<<"big
endian."<<endl;

    }

    else
if(test.b[0]==0x02&&test.b[1]==0x01){

        cout<<"small
endian."<<endl;

    }

    else{

       
cout<<"unknown"<<endl;

    }

    return 0;

}

程序的执行结果是:

small endian.

其中,big endian是指低地址存放最高有效字节,little endian则是低地址存放最低有效字节。如果将0x1234abcd写入0x0000开始的内存中,则结果如表1-2所示。

表1-2 big endian和little endian的内存地址增长方向

地址     big endian   little endian

0x0000  0x12     0xcd

0x0001  0x34     0xab

0x0002  0xab     0x34

0x0003  0xcd     0x12

 

表1-2展示了0x1234abcd分别在big endian的系统和在little endian的系统上的内存地址是怎么样分布的。例如0x0000是1Byte的存储单元,0x12单元一共占了8bit,也就是1byte,即占用了1Byte。

目前,几乎所有网络协议都是采用big endian的方式来传输数据的,当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序(big endian)后再进行传播。

3.?枚举

在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期只有7天,一年只有12个月,一个班每周有6门课程等。如果把这些量说明为整型,字符型或其他类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型,枚举类型在C++中也同样适用。在“枚举”类型的定义中列举出所有可能的取值,用来说明该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何其他基本类型。

枚举的声明方式为:

enum 枚举类型名{枚举常量表列};

如同结构和共用体一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。

设有变量a, b, c是枚举类型weekday,可采用下述任一种方式:

enum weekday{
sun,mou,tue,wed,thu,fri,sat };

enum weekday
a,b,c;

或者为:

enum weekday{
sun,mou,tue,wed,thu,fri,sat }a,b,c;

或者为:

enum {
sun,mou,tue,wed,thu,fri,sat }a,b,c;

枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。

例如对枚举weekday的元素再作以下赋值,都是错误的:

sun=5;

mon=2;

sun=mon;

只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量,如下面的语句是正确的:

a=sum;

b=mon;

而下面的语句则是错误的:

a=0;

b=1;

如一定要把数值赋予枚举变量,则必须用强制类型转换,如:

a=(enum
weekday)2;

其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:

a=tue;

还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。

【例1.13】 enum使用范例。

#include<iostream>

using namespace
std;

int main(){

    enum weather{sunny,cloudy,rainy,windy};

    /*其中sunny=0,cloudy=1,rainy=2,windy=3,

    默认地,第一个枚举子被赋值为0*/

    enum fruits{apple=3,orange,banana=7,bear};

    /*也可以显式地赋值,接下来的枚举子取值是前面一个枚举子的取值+1,即orange=4,bear=8*/

    cout<<orange<<endl;

    enum big_cities{guangzhou=1,shenzhen=3,
eijing=1,shanghai=2};

    /*同一枚举中的枚举子的取值不需要是唯一的*/

    return 0;

}

程序的执行结果是:

4

例1.13中定义了3个枚举类型:weather、fruits和big_cities,其中weather中的枚举子都被显式地赋值了,fruits中的枚举子只赋值了其中几个,没显式赋值的则是前面一个枚举子的取值+1。同一枚举类型中的枚举子的取值不需要是唯一的,可以相同。

时间: 2024-11-10 05:19:14

后台开发:核心技术与应用实践1.6.1 结构体、共用体、枚举的概念的相关文章

后台开发:核心技术与应用实践1.6.2 结构体、共用体在内存单元占用字节数的计算

1.6.2 结构体.共用体在内存单元占用字节数的计算 一般64位机器上各个数据类型所占的存储空间如下所述. (1)char:8bit=1byte. (2)short:16bit=2byte. (3)int:32bit=4byte. (4)long:64bit=8byte. (5)float:32bit=4byte. (6)double:64bit=8byte. (7)long long:64bit=8byte. 其中,long类型在32位机器上只占4Byte,其他类型在32位机器和64位机器都是

后台开发:核心技术与应用实践

后台开发:核心技术与应用实践 徐晓鑫 著 图书在版编目(CIP)数据 后台开发:核心技术与应用实践 / 徐晓鑫著. -北京:机械工业出版社,2016.8 ISBN 978-7-111-54339-8 I. 后- II. 徐- III. 网络-开发 IV. TP393.092 中国版本图书馆CIP数据核字(2016)第167884号 后台开发:核心技术与应用实践 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037) 责任编辑:李 艺 责任校对:董纪丽 印 刷: 版 次:

后台开发:核心技术与应用实践导读

后台开发:核心技术与应用实践 徐晓鑫 著 图书在版编目(CIP)数据 后台开发:核心技术与应用实践 / 徐晓鑫著. -北京:机械工业出版社,2016.8 ISBN 978-7-111-54339-8 I. 后- II. 徐- III. 网络-开发 IV. TP393.092 中国版本图书馆CIP数据核字(2016)第167884号 后台开发:核心技术与应用实践 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037) 责任编辑:李 艺 责任校对:董纪丽 印 刷: 版 次:

Android开发:优化ListView实践解析

 在看了一些vogella的文章之后,发现关于android listview性能优化这一段很有意思,于是实践了一下,经过优化,性能确实提升不少! 先看看优化前和优化后的比较: 优化前的log截图: 开发:优化ListView实践解析-"> 优化后的log截图: 并且,在不停滚动ListView的过程中,优化之前会出现ANR现象,在AVD上特别容易复现: 然后,优化后显得很流畅,附上对于的log截图: 下面附上相关代码分析: ListView中的每一个Item由一个ImageView 和一

android-Android后台开发相关书籍资料

问题描述 Android后台开发相关书籍资料 Android APP后台搭建过程,如何使用开发语言实现,请推荐相关书籍,谢谢. 解决方案 <第一行代码> <疯狂Android讲义> <Android群英传> <Android开发艺术探究> 解决方案二: 后台开发相关书籍Android各层开发推荐书籍及资料(转)Android相关开发资料汇总 解决方案三: http://www.jikexueyuan.com/course/2208.html 解决方案四: 深

mysql-app后台开发,如何做好安全性?

问题描述 app后台开发,如何做好安全性? app后台开发一枚,现在要对整个项目做一些安全性,比如拦截非法请求,sql注入什么的 后台开发技术:spring + mybatis + mysql 求一些思路.麻烦了. 解决方案 比如检查密码的sql语句一定要处理特殊字符? = ' 等等,最后还是要写file.将你所设想到的情况全写下来.后期安全还有问题再添加. 解决方案二: 最好安卓请求时要带上自己的用户信息 解决方案三: 接口的话,多加一些加密处理了,然后在登录的时候带token,再就是服务器的

linux 后台开发-后台开发需要些什么东西

问题描述 后台开发需要些什么东西 我是一名大三的学生,想做后台开发,但是又不知道该从哪方面做起.目前Linux c/c++都学的不错,数据结构也学过,SQL.socket网络通信也学过,TCP/IP协议也有一定了解,然后,下一步不知道该干嘛了,我觉得自己学的这些东西比较基础,都不知道怎么怎么能把它们应用实际.望各位大牛能指点迷津 解决方案 这看你想做哪方面的了.linux服务器开发维护,数据库开发维护,网站后台web开发(javawebphp.net等) 解决方案二: 你所学的仅仅是基础,多看看

Linux 后台开发工作中常用的开源库

后台开发,语言主要是 c 和 c++ , 这里简单罗列一下工作中用的很频繁的那些开源软件 1. OpenSSL openssl OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. 下载地址: https://www.openssl.org/source/ 2.TinyXML tinyxml 简单,高效,灵活的一套操作 XML 文件的开源库. 下载地址: http://www.grinninglizar

javascript-App后台开发用哪种语言

问题描述 App后台开发用哪种语言 我想问开发一个APP的后台,想实现的功能有实时聊天,图片,视频的上传和下载等, 用java写好,还是其他的好 解决方案 java.php.python.c++.....很多,建议使用java,轮子多,效率高,也可以用python,简单,效率也不低 解决方案二: 后台有很多选择,如果你熟悉android,那么当然选java,那是你熟悉的语言,如果你熟悉js,可以用node.js,其它的语言还有C# VB PHP Ruby Python Go ... 解决方案三:

ios-iOS APP后台开发技术问题请教

问题描述 iOS APP后台开发技术问题请教 如果要搭建一个IOS应用(假设用户量为几十万)的后台服务器,现在比较靠谱的后台架构是怎样的? (先说说我现在的理解,之前做过一些Android开发的事情,当时后台是写了一个简单的Http服务器(利用Netty实现),然后前端和后台的数据交换采用json实现,至于服务器硬件的配置等等没有过考虑.所以我现在可以认识到的后台,就是HTTP请求+Json返回数据.) 想请教一下各位:从服务器硬件到操作系统再到后台技术框架,有没有一个比较系统.成熟.可靠的模式