C++基础5:结构体、联合体、枚举

目录

一、结构体

1.结构体struct

2. 结构体成员对齐

二、联合体

三、枚举

四、综合运用(L1范数为例)

五、typedef


一、结构体

1.结构体struct

把几个不同类型的成员打包在一起,形成新的数据类型

struct Student{
    char name[4];
    int born;
    bool male; 
};
struct Student stu;//C语言
Student stu;//C++
strcpy(stu.name, "Yu");用.操作成员变量
stu.born = 2000;
stu.male = true;
struct Student stu = {"Yu", 2000, true};//初始化
struct Student students[100];//结构体数组,里面有100个结构体
students[50].born = 2002; 

 

 

13

 

12

 

11

 

10

 

9

male

1

8

born

2000

7

6

5

4

name

0

3

0

2

'u'

1

'Y'

0

 

-1

 

-2

 

2. 结构体成员对齐

struct Student1{
    int id;
    bool male;
    char label;
    float height;
};

 

 

height

 

11

10

9

8

 

7

 

6

label

 

5

male

 

4

id

 

3

2

1

0

 

 

为了io方便把变量对齐,绝对0地址,都是4的倍数,8的倍数height到6,一次性就装不完,装两次,后面读写效率更高 

struct Student2{
    int id;
    bool male;
    float height;
    char label;
};

 

 

 

15

 

14

 

13

label

 

12

weight

 

11

10

9

8

 

7

 

6

 

5

male

 

4

id

 

3

2

1

0

 

 

一般4个字节对齐

二、联合体

一个IP地址

union ipv4address{
std::uint32_t address32;
std::uint8_t address8[4];
};

联合体里面所有成员共享同一个内存

两个变量首地址相同,以最大的成员变量为准

sizeof(union ipv4address) is 4.

Union

Address

 

 

 

p+4

address8[3]

address32

127

p+3

address8[2]

0

p+2

address8[1]

0

p+1

address8[0]

1

p+0

 

p-1

 

三、枚举

替换const

enum color {WHITE, BLACK, RED, GREEN, BLUE, YELLOW, NUM_COLORS};
enum color pen_color = RED;
pen_color = color(3); 
cout << "We have " << NUM_COLORS << " pens." << endl;
pen_color += 1; //error!枚举类型不可做算数运算
int color_index = pen_color;
color_index += 1;
cout << "color_index = " << color_index << endl;

四、综合运用(L1范数为例)

L1范数

enum datatype {TYPE_INT8=1, TYPE_INT16=2, TYPE_INT32=4, TYPE_INT64=8};
//point用来表示3维世界的向量(x,y,z),向量用union表示,向量的数据类型可能不同,该用那个由枚举类型决定
struct Point{
enum datatype type;
union {
std::int8_t data8[3];
std::int16_t data16[3];
std::int32_t data32[3];
std::int64_t data64[3];
};
};
size_t datawidth(struct Point pt)
{
 return size_t(pt.type) * 3;
}

int64_t l1norm(struct Point pt)//L1范数
{
int64_t result = 0;
switch(pt.type)
{
case (TYPE_INT8): 
result = abs(pt.data8[0]) +
abs(pt.data8[1]) +
abs(pt.data8[2]);
break;
 ...

五、typedef

使用 typedef 为现有类型创建别名

typedef int myint;
typedef unsigned char vec3b[3];
typedef struct _rgb_struct{//name _rgb_struct can be omit
unsigned char r;
unsigned char g;
unsigned char b;
} rgb_struct;
myint num = 32;
unsigned char color[3];
vec3b color = {255, 0, 255}; //color是个数组,和上面一样
rgb_struct rgb = {0, 255, 128};

常用在系统头文件

_uint8_t.h

#ifndef _UINT8_T
#define _UINT8_T
typedef unsigned char uint8_t;
#endif /* _UINT8_T */

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值