Chapter 4 Data Structures
Arrays
三个特点,连续分配,固定长度(长度不可以改变),元素种类什么都可以。
下面展示了声明方法。
这种数组在编译之前长度就被确定下来,长度不能在程序中改变。
如果 int array[5] = {0, 1, 2},的话,存储是{0,1,2,0,0},剩下的全是0.
Variable-length arrays
这种特性早期没有,后来才开始支持。
Arrays of unknown size
Element accessing
因此,c和c++中的数据访问速度更快,但是对于越界没有保护。
Multidimensional arrays
必须指出第二个参数,只有这样才知道从什么位置开始存放第二个数据
const arrays
如果不希望更改变量,就是const.不多说。
Strings
Array-style strings
String literals
上面的方法太复杂了,看下这种办法
String manipulation and examination
string class
避免越界问题:传统C风格字符串容易产生越界问题,因为它们是手动管理的字符数组,并依赖于null字符('\0'
)来标记字符串的结束。如果忘记加上null字符,或者操作不慎,很容易导致越界访问,进而引发安全问题。std::string
类在内部管理内存,避免了手动管理null字符的问题,从而减少了越界的风险。
并且提供了许多方便的操作符来操作字符串。例如图片中的+。
struct
注意,结构体最后的分号。
Structure padding
label
并不需要放在4的倍数地址位置的原因是与数据对齐的规则有关。不同类型的数据在内存中有不同的对齐要求,通常是根据数据类型的大小来确定的:
int
类型(通常占用4个字节):需要放在4字节对齐的地址上(即地址为4的倍数)。bool
类型(通常占用1个字节):不需要特殊的对齐要求,可以放在任何地址上。char
类型(通常占用1个字节):像bool
一样,没有对齐要求,也可以放在任何地址上。float
类型(通常占用4个字节):同样需要放在4字节对齐的地址上。
在Student1
和Student2
结构中,label
是char
类型,占用1个字节,不需要特殊的对齐,因此它可以放在内存的任意地址上(即不必非得是4的倍数)。但float
和int
等4字节类型的数据需要4字节对齐,这就是为什么需要在这些数据之前填充空字节(padding),以确保它们位于正确的对齐地址。
struct in C and C++
union
在union
中,由于所有成员共享相同的内存位置,因此每次只能存储一个成员的数据。如果你往union
中的某个成员存入了数据,那么存储在其他成员中的数据会被覆盖。
例如,在这个ipv4address
联合体中:
address32
和address8[4]
共享同一段4字节的内存。如果你给address32
赋值,那么address8
的每个字节也会被这个32位的值覆盖,反之亦然。
也就是说,如果你存入一个address32
的值,读取address8
的值时,你将得到的是该address32
值在内存中的字节形式。这个特性使得union
非常适合处理不同表示方式的数据,如IP地址可以同时用32位整数或4个8位字节表示。
union
会根据其成员中占用空间最大的类型来分配足够的内存。由于所有成员共用相同的内存空间,它们的首地址(也就是内存的起始地址)都是相同的。
enum
enum
用于创建一个新的类型,枚举类型包含一组符号常量。每个符号常量都有一个整数值,从0开始依次递增。例如,color
枚举类型包含了WHITE, BLACK, RED, GREEN, BLUE, YELLOW, NUM_COLORS
这些符号常量,它们的整数值分别是0, 1, 2, 3, 4, 5, 6
。
enum color pen_color = RED;
这将pen_color
的值设为RED
(即整数2)。此外,你可以通过强制类型转换,将整数值赋给枚举变量:
pen_color = color(3); // 将pen_color赋值为3,表示GREEN
typedef
上面那个typedef那个[3]是跟着前面的type走的。注意