

新闻资讯
技术学院C++中获取数组长度需区分原生数组与指针:原生数组用sizeof(arr)/sizeof(arr[0]);模板函数或C++17的std::size可类型安全推导;函数参数中数组会退化为指针,应使用引用、std::array或std::vector。
在C++中,获取数组长度不能像Python那样直接调用len(),但有几种可靠方式——关键在于区分“原生数组”和“指针”,因为一旦数组退化为指针(比如传入函数后),sizeof就失效了。
sizeof(array) / sizeof(array[0]) 是最常用、最直接的方法,但它只对定义在当前作用域的原生数组有效(即未退化为指针)。
sizeof(数组名) 返回整个数组占用的字节数,sizeof(数组元素) 得到单个元素大小,相除即元素个数array 是真正的数组类型,不是 int* 或函数参数(后者 sizeof 返回指针大小,通常是 4 或 8)模板方法能避免误用于指针,且支持编译期计算,更健壮:

template constexpr size_t array_size(T (&)[N]) { return N; }
N,即使元素类型复杂(如 std::string[5])也能正确返回 5sizeof 更安全std::size(arr)(需 #include ),本质就是该模板的标准化封装这是最容易出错的地方。形如 void func(int arr[]) 或 void func(int* arr) 中,arr 已是 int*,sizeof(arr) 不再是数组总大小。
立即学习“C++免费学习笔记(深入)”;
template void func(int (&arr)[N]) ,这样能保留长度信息std::array 或 std::vector,它们自带 .size() 成员函数,语义清晰且无退化问题现代C++中,优先考虑标准容器替代裸数组:
std::array arr = {1,2,3,4,5}; —— 编译期定长,arr.size() 安全、直观、constexpr 友好std::vector vec = {1,2,3}; —— 运行期可变长,vec.size() 返回当前元素数