2023-03-22 15:03:24
在C++中,获取静态数组长度的常用方法是使用sizeof(arr)/sizeof(arr[0]),但该方法存在明确的应用限制,需结合具体场景选择合适方案。
一、sizeof获取静态数组长度的原理与示例原理:通过计算整个数组占用的字节数(sizeof(arr))除以单个元素的字节数(sizeof(arr[0])),得到元素个数。
int arr[] = {1, 2, 3, 4, 5};int length = sizeof(arr) / sizeof(arr[0]); // 正确结果:5sizeof(arr):返回数组总字节数(如int类型数组,5个元素×4字节=20字节)。
sizeof(arr[0]):返回单个元素的字节数(如int类型通常为4字节)。
适用场景:仅适用于函数内部定义的静态数组或全局静态数组。
问题:当数组作为函数参数传递时,会退化为指针,sizeof(arr)仅返回指针大小(通常为4或8字节),而非数组总大小。
void printLength(int arr[]) { cout << sizeof(arr) << endl; // 输出指针大小(如8字节),非数组长度}原因:函数参数中的数组类型实际为指针,丢失了原始数组的长度信息。
问题:通过new动态分配的数组,sizeof仅返回指针大小,无法获取实际分配的元素数量。
int* arr = new int[10];cout << sizeof(arr) << endl; // 输出指针大小(如8字节),非10原因:动态数组仅返回指向内存块的指针,不包含长度信息。
std::array:固定大小数组,提供.size()方法。
#include <array>std::array<int, 5> arr = {1, 2, 3, 4, 5};cout << arr.size() << endl; // 输出:5std::vector:动态大小数组,支持.size()和动态扩容。
#include <vector>std::vector<int> vec = {1, 2, 3};vec.push_back(4);cout << vec.size() << endl; // 输出:4结构体封装:将数组与长度信息绑定。
struct ArrayWrapper { int* data; size_t length;};int data[5] = {1, 2, 3, 4, 5};ArrayWrapper arr = {data, 5};函数模板引用传递:通过引用接收数组,保留大小信息。
template <size_t N>void printLength(int (&arr)[N]) { cout << "数组长度:" << N << endl; // 正确输出:5}int arr[] = {1, 2, 3, 4, 5};printLength(arr);std::unique_ptr + 手动记录长度:结合智能指针与长度变量。
#include <memory>size_t length = 10;auto arr = std::make_unique<int[]>(length);// 需自行维护length变量