Chapter 4 Data Structures

Arrays

Pasted image 20241002092057.png
三个特点,连续分配,固定长度(长度不可以改变),元素种类什么都可以。
下面展示了声明方法。

长度确定

这种数组在编译之前长度就被确定下来,长度不能在程序中改变。

其他声明方法

如果 int array[5] = {0, 1, 2},的话,存储是{0,1,2,0,0},剩下的全是0.

Variable-length arrays

Pasted image 20241002092736.png
这种特性早期没有,后来才开始支持。

Arrays of unknown size

Pasted image 20241002092846.png

Element accessing

Pasted image 20241002095514.png
因此,c和c++中的数据访问速度更快,但是对于越界没有保护

Multidimensional arrays

Pasted image 20241002095913.png
必须指出第二个参数,只有这样才知道从什么位置开始存放第二个数据

const arrays

Pasted image 20241002111643.png
如果不希望更改变量,就是const.不多说。

Strings

Array-style strings

Pasted image 20241002113112.png

String literals

上面的方法太复杂了,看下这种办法
Pasted image 20241002113754.png

String manipulation and examination

Pasted image 20241002113824.png

string class

Pasted image 20241002113919.png
避免越界问题:传统C风格字符串容易产生越界问题,因为它们是手动管理的字符数组,并依赖于null字符('\0')来标记字符串的结束。如果忘记加上null字符,或者操作不慎,很容易导致越界访问,进而引发安全问题。std::string类在内部管理内存,避免了手动管理null字符的问题,从而减少了越界的风险。

并且提供了许多方便的操作符来操作字符串。例如图片中的+。

struct

Pasted image 20241002115730.png
注意,结构体最后的分号。

Structure padding

Pasted image 20241002122507.png
label并不需要放在4的倍数地址位置的原因是与数据对齐的规则有关。不同类型的数据在内存中有不同的对齐要求,通常是根据数据类型的大小来确定的:

Student1Student2结构中,labelchar类型,占用1个字节,不需要特殊的对齐,因此它可以放在内存的任意地址上(即不必非得是4的倍数)。但floatint等4字节类型的数据需要4字节对齐,这就是为什么需要在这些数据之前填充空字节(padding),以确保它们位于正确的对齐地址。

struct in C and C++

Pasted image 20241002122620.png

union

Pasted image 20241002122651.png
union中,由于所有成员共享相同的内存位置,因此每次只能存储一个成员的数据。如果你往union中的某个成员存入了数据,那么存储在其他成员中的数据会被覆盖。
例如,在这个ipv4address联合体中:

Note

union 会根据其成员中占用空间最大的类型来分配足够的内存。由于所有成员共用相同的内存空间,它们的首地址(也就是内存的起始地址)都是相同的。

enum

Pasted image 20241002122903.png
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

Pasted image 20241002123559.png
上面那个typedef那个[3]是跟着前面的type走的。注意