C++知识——3、结构体、共用体、枚举

一、概念

在这里插入图片描述

1、结构体

struct  结构名  {
    数据类型  成员名;
    数据类型  成员名;
    …
};

成员表由若干个成员组成,每个成员都是该结构的一个组成部分,对每个成员也必须做类型声明。

使用范例:

#include<iostream>
#include<string.h>
using namespace std;
struct student{
    int num;
    char name[20];
    int age;
};

int main(){
    student stu1;
    stu1.num=1;
    char temp[20]=“xiaoming";
    strcpy(stu1.name, temp);
    stu1.age=10;
    cout<<stu1.name<<stu1.num<<stu1.age<<endl; 
}

2、共用体

一个共用体里可定义多种不同数据类型,但这些数据共享一段内存(同一时间只能存一个成员变量的值)(节省空间)(类似于时分复用)

union 共用体类型名{
数据类型 成员名;
数据类型 成员名;

}变量名;

注:big endian和littile endian的内存地址增长方向
在这里插入图片描述
big endian:指低地址存放最高有效字节。目前几乎所有网络协议都采用big endian的方式来传输数据,因此big endian也叫网络字节序

3、枚举

在“枚举”类型的定义中列举出所有可能的取值。
声明方式:

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

eg. 设有变量a、b、c是枚举类型weekday,可采用下列任一种方式:
1)

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

2)

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

3)

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

特别注意:

1)枚举值是常量,不是变量。不能在程序中用赋值语句再对其进行赋值。
eg:对枚举weekday的元素再作一下赋值,都是错误的。

sun=5;
mon=2;
sum=mon;

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

a=sum;
b=mon;

以下语句是错误的:
a=0;
b=1;

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

a=(enum weekday) 2;

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

a=tue;

4)枚举元素既不是字符常量也不是字符串常量,在使用时不要加单、双引号。

二、结构体、共用体在内存单元占用字节数的计算
一般64位计算机上各数据类型所占的存储空间如下:(注:bit比特、byte字节)
(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(属于int型)
注:其中long类型在32位机器上只占4byte,其他不变。

1、union的字节数计算

#include<iostream>
using namespace std;
union A {
    int a[5];
    char b;
    double c;
};
int main() {
    cout<<sizeof(A)<<endl;
    return 0;
}

结果:24
union中变量共用内存,应以最长的为准。但并不是预想的20(int a[5], 5*4=20byte),这是因为在共用体内变量的默认内存对齐方式,必须以最长的double(8byte)对齐,也就是应该是sizeof(A)=24。所以将共用体中的int a[5]改成int a[6]后,结果仍然不变。但如果将int a[5]改成int a[7],结果就变成32。
通俗解释:如果是20,那么可以存几个double型?两个半吗?所以要延伸其空间,使其大于20但又刚好满足其他成员的整数倍

2、struct的计算方法
#include
using namespace std;
struct B {
char a;
double b;
int c;
}test_struct_b;
int main() {
cout<<sizeof(test_struct_b)<<endl;
return 0;
}
结果:24
详见《后台开发核心技术与应用实践》19页。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值