白话 C++ 7.7 数组

白话 C++ 7.7 数组
最新回答
喻夜白

2026-05-16 01:16:21

白话 C++ 7.7 数组

1. 数组的定义

  • 1.1 栈数据中的数组

    定义方式:类型名 数组名[个数];

    注意事项:数组名代表数组首个元素的首地址,当使用指针指向数组时,直接将数组名赋值给指针即可,无需使用取地址符&。数组名可视为一种特殊的、不可修改的、指向数组首个元素首地址的指针。

  • 1.2 堆数据中的数组

    定义方式(赋值式):类型名* 指向该类型的指针名 = new 类型名[个数];

    定义方式(构造式):类型名* 指向该类型的指针名(new 类型名[个数]);

2. 数组的初始化

  • 定义数组的同时进行初始化,可以使用列表式、赋值式或构造式(但构造式在C++中可能有警告,不推荐使用)。
  • 数组字面量需用花括号{}括起来。

3. 常量数组

  • 用const修饰的数组称为常量数组,必须在定义时初始化,之后不可改变数据内容。
  • 定义方式:const 类型名 数组名[个数]{字面量}; 或 类型名 const 数组名[个数]{字面量};

4. 数组的复制

  • 数组不支持直接使用赋值符号=进行复制。
  • 可以使用STL的std::copy函数或手动编写for循环进行复制。
  • std::copy函数的使用方式:std::copy(源对象开始位置, 源对象结束位置, 目标对象开始位置);

5. 数组的退化

  • 数组名作右值使用时,会自动变为一个指向数组首个元素首地址的指针,即数组的“退化”。
  • 数组名作为函数参数时,会退化为指针,形式参数可以有以下两种写法:

    方式一:普通的数组名,后面加方括号[](方括号里可以写个数,也可以不写,没有实际作用)。

    方式二:该数组元素类型的一个指针。

6. 字符数组、字符指针与字符串

  • 字符数组:元素类型是字符的数组。
  • 字符指针:指向字符型数据的指针,可以指向单个字符变量、字符数组或字符串。
  • 字符串:当字符指针指向字符串时,字符串的字面量是一个匿名的字符串,只能通过字符指针访问。字符串字面量会自动添加一个空字符0表示结束。
  • 字符串字面量是常量,如果赋值给普通字符指针char*会发生强制转换,可以运行但编译器会给出警告。使用常量字符指针const char*则不会有警告。

7. 多维数组

  • 多维数组是指在数组中的每一个元素也是一个数组。
  • 定义方式:类型名 数组名[第一个维度个数][第二个维度个数][第三个维度个数];

8. 指针和数组

  • 指针数组:某类型的指针作为元素组成的数组。定义方式:类型名* 数组名[个数];
  • 数组指针:一个指针,明确指向一种特定类型的数组。定义方式:类型名 (*数组指针变量名)[个数]; 赋值方式:数组指针变量名 = &数组名;

9. 数组的别名

  • 使用数组别名可以简化定义新数组时的写法,但可能隐藏数组元素类型和个数,导致误解。
  • 推荐使用C++11标准的using关键字给数组起别名。定义方式:using 数组别名 = 原数组元素类型名[个数];
  • 老代码中使用typedef关键字起别名时,注意方括号[]要放在最后。定义方式:typedef 原数组元素类型名 数组别名[个数];