南科大C++ 第四章(数组,结构体,联合体,枚举)
数组
边界检测
C++中的数组不会进行边界检测,即可以使用类似-1这样的位置访问到超过数组管理范围的内存,这样容易引发错误。
二维数组
二维数组作为函数参数时可以可以只定义第二个维度即列,类似于可以不定义步数但要定义步长。
结构体
内存对齐
在结构体中不同的数据存放顺序结构体所占内存的大小也不一样
这是因为内存会对齐存放保证IO时读取的效率。
C与C++之间的差异
在C中结构体一定要加上struct
但C++中不一定
联合体
联合体与结构体不同,联合体中定义对象是对于同一块内存的不同访问方法:
大小由总和最大的数据访问方式定义
枚举
一种多个元素的集合
下面是一个与联合体,结构体一同使用的例子:
#include <iostream>
#include <cstdio>
#include <cstdint>
using namespace std;enum color {WHITE, BLACK, RED, GREEN, BLUE, YELLOW, NUM_COLORS};
enum datatype {TYPE_INT8=1, TYPE_INT16=2, TYPE_INT32=4, TYPE_INT64=8};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)
{int64_t result = 0;switch(pt.type){case (TYPE_INT8): result = abs(pt.data8[0]) + abs(pt.data8[1]) + abs(pt.data8[2]);break;case (TYPE_INT16): result = abs(pt.data16[0]) + abs(pt.data16[1]) + abs(pt.data16[2]);break;case (TYPE_INT32): result = abs(pt.data32[0]) + abs(pt.data32[1]) + abs(pt.data32[2]);break;case (TYPE_INT64): result = abs(pt.data64[0]) + abs(pt.data64[1]) + abs(pt.data64[2]);break;}return result;
}int main()
{enum color pen_color = RED;pen_color = color(3); //convert int to enumcout << "We have " << NUM_COLORS << " pens." << endl;//pen_color += 1; //error!int color_index = pen_color;color_index += 1;cout << "color_index = " << color_index << endl;//declaration and initializationstruct Point point1 = {.type=TYPE_INT8, .data8={-2,3,4}};struct Point point2 = {.type=TYPE_INT32, .data32={1,-2,3}};cout << "Data width = " << datawidth(point1) << endl;cout << "Data width = " << datawidth(point2) << endl;cout << "L1 norm = " << l1norm(point1) << endl;cout << "L1 norm = " << l1norm(point2) << endl;return 0;
}