一、定义数组
1.1 静态数组定义
- 编译时固定大小:在编译时就确定数组大小,通常使用常量或直接指定大小。
全局数组初始化:全局或静态数组的元素如果不显式初始化,则默认初始化为 0。
1.2 动态数组定义(C++)
在 C++ 中,可以使用 new 关键字在运行时动态分配数组,适合需要在程序运行中根据情况确定数组大小的场景。
注意:动态分配的数组需要手动释放内存,否则会导致内存泄漏。
1.3 使用 C++ 标准库中的 std::vector
std::vector 是 C++ 标准库中的动态数组类型,支持动态扩展,适合频繁增删数据的情况。
二、数组的初始化方式
2.1 静态数组初始化
- 完整初始化:在定义数组时直接使用花括号 {} 赋值。
部分初始化:初始化部分元素,剩余未指定的元素会自动初始化为 0(仅适用于静态或全局数组)。
省略大小自动推导:当直接初始化数组时,可以省略数组大小,由编译器自动推导。
字符数组初始化:字符数组可以使用字符串字面量直接初始化,字符串末尾自动添加 0。
2.2 动态数组初始化(C++)
- 动态分配的数组没有默认初始值,通常需要使用循环手动初始化。
使用 std::vector 初始化:
2.3 使用 C++11 的 std::array 初始化
C++11 引入了 std::array,可以提供更安全的固定大小数组。
三、多维数组的定义和初始化
3.1 二维数组的定义和初始化
二维数组是由多个一维数组组成的,可以用嵌套的花括号初始化。
省略内层花括号:可以省略内层花括号,编译器会自动识别。
部分初始化:部分初始化同样适用,未指定的元素自动初始化为 0。
3.2 动态二维数组(C++)
动态二维数组通常使用指针数组来实现。
3.3 使用 std::vector 实现二维数组
在 C++ 中,std::vector 可以方便地实现动态二维数组,并且自动管理内存。
四、数组使用注意事项
- 数组越界:在访问数组元素时,一定要确保访问的索引在有效范围内,否则会导致未定义行为。
动态数组内存管理:动态数组在使用完后需要手动释放内存,否则会导致内存泄漏。
数组传递:C/C++ 默认按地址传递数组。可以传递指针或使用引用传递 std::array 或 std::vector,这样可以避免复制整个数组。
1. 指向数组第一个元素的指针
在大多数情况下,数组名可以看作一个指向数组首元素的指针常量,即它的值是数组的首地址,且这个地址在程序运行过程中不会改变。例如:
2. 区分数组名和指针的特殊性
虽然数组名和指向数组首元素的指针在许多场合都可以互换,但数组名和指针并不完全等价,有以下区别:
- 数组名不能修改:数组名表示的是一个常量指针,其值(即数组首地址)不能被修改,因此无法执行 arr++ 或 arr = new int[10] 等操作。
指针可以重新指向其他地址:普通指针可以指向不同的地址,可以使用 p++ 或 p = &other_variable。
3. 隐式转换为指针
在表达式中,数组名会自动转换为指向数组首元素的指针,这种转换称为隐式转换,通常在函数传参、指针运算等场景下发生:
4. 在函数参数中的行为
在函数参数中,数组名通常会被自动转换为指向数组首元素的指针,这意味着传递数组作为参数时,实际上传递的是数组的地址(指针),而不是数组的值(内容拷贝)。因此,在函数内部对数组元素的修改会影响到原数组。
5. 多维数组中的含义
在多维数组中,数组名的含义会随数组的维度而变化。对于二维数组 int arr[3][4];,arr 的类型是 int[4] 的指针,即指向一个包含 4 个 int 元素的数组。若再对 arr 进行解引用操作,例如 arr[1],其结果是一个指向单个 int 元素的指针。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/54263.html