4.1 array 数组

  • 数组可以不初始化,如 int num[5];
    • 但是如果要使用数组,必须对其进行初始化
      • 未初始化的数组,里面的数值是随机的
      • 若数组值未全部初始化,则其余的值为 0
    • 数组一旦申请完,其元素个数不可以更改
      • 即数组有固定数量的对象
  • unknown size 未知长度的数组 int num[]
    • 通过初试化列表的长度来决定数组的长度
    • 或用于函数的参数中,数组长度未知
  • c/C++中数组没有越界检查
    • 即若数组越界,不会报警告或错误
    • 优点是效率高,缺点是程序容易出错
  • 多维数组
    • 二维数组 int mat[2][3]= {{1,2,3},{4,5,6}};
    • 遍历二维数组需要双重循环
  • const array 常量数组
    • 数组元素值不可修改,只能在初始化时赋值
    • 常用于函数中,防止数组元素被修改

4.2 strings

  • 类型
    • 数组字符串 array-style strings
    • string 类 string class
  • 数组字符串
    • 元素类型为 char
    • 初始化为 char rabbit[16] = {‘ char型’,‘a’ }
    • 字符串的结束标志为 null 即 \0
      • 不加 0 来结束字符串,可能会产生和其他字符串混乱的越界问题
      • 若越界严重会被操作系统杀死
  • string literals 常量字符串
    • 初始化为 char name[] = " 一段字符串内容 "
    • 注意,常量字符串的长度为内容长度+1
      • 因为数组中最后会存储一个\0
  • 字符串的操作和检验 string manipulation and examination
    • copy 拷贝操作
      • char* strcpy (char* dest,const char* src)
      • 将 src 数组中的所有元素拷贝到 dest 中
        • 目标数组 dest 可能容量不够,造成越界和溢出
    • 安全的拷贝操作
      • char* strncpy (char* dest,const char* src,size_t count)
      • count 值为最多拷贝的元素数量
    • concatenate 字符串的链接
      • char* strcat(char* dest, const char src)
    • compare 字符串的比较
      • int strcmp(const char *lhs,const char *rhs)
      • 前大后小会返回正值,前小后大会返回负值
        • 一般为首字母的排位相减的值
  • string 类 class
    • std::string str1 = “hello”
      • 更方便
    • std::string result = str1 + "," + str2
      • 可以无需调用 strcat 直接连接字符串
    • string 类也没有越界检查

4.3 结构体、连接体和枚举类型 structures ,unions and enumerations

  • 结构体
    • 一种新的数据类型,其中的数据成员会顺序存储在结构体内
struct Student{
    char name[4];
    int born;
    bool male;
};
  • 定义结构体后可用于声明变量
    • struct Student stu
      • 声明了一个 Student 类型的结构体 stu
        • 必须加上 struct 这个 tag
      • 也可通过 struct Student stu = {"", , } 来初始化
    • 引用变量通过 stu.name stu.born stu.male
    • 基于边界对其的存储方式,会导致结构体的变量顺序不同,从而有可能结构体的占用 size 不同

注意:在 c++中,可以不使用 struct 标签声明变量

  • 但是若在 c 语言中,会编译不通过
  • 可以将结构体声明改为 struct Student{} Student ;
  • c++中的结构体和类是一样的,但是 c 中不同
  • 联合体 union
    • union 的定义与结构体一样
union ipv4addres{
    std::uint32_t address32;
    std::uint8_t address8[4];
};
  • 联合体与结构体的区别
    • 联合体 union 的成员变量共享同一个内存
      • 即首地址完全相同
      • 其大小以其中最大的变量为准
      • 满足是所有成员的整数倍
      • ==本质上即为同一个数据有不同的名字==
  • 枚举类型 enum
    • 用于替换 const 常量类型
    • 定义为 enum color {white,black,numcolors}
      • 分别为 0,1,2
        • 即 numcolors 可以直接表示出颜色为 2
    • 引用 enum
      • enum color pen = black;
      • pen = color(1);
    • 枚举类型不可以做算术运算
      • 可以转换成 int 型后做算术运算

4.4 typedef

  • typedef 用来创建一个类型的别名
    • typedef int myint;
      • 创建后可通过 myint 来定义 int 变量
    • typedef undesigned char vec3b[3]
      • 定义为有三个元素的字符组