静态二维数组可用sizeof在编译期计算行列数:行数=sizeof(arr)/sizeof(arr[0]),列数=sizeof(arr[0])/sizeof(arr0);vector用size()方法并需判空;int**无维度信息,须额外维护rows/cols;模板可安全推导静态数组维度。

用 sizeof 获取静态二维数组的维度(仅限栈上定义)
只有在编译期已知大小的静态数组(比如 int arr[3][4])才能用 sizeof 算出行列数。这是因为 sizeof 是编译期运算,对指针或动态分配的内存无效。
计算逻辑是:行数 = sizeof(arr) / sizeof(arr[0]),列数 = sizeof(arr[0]) / sizeof(arr[0][0])。注意 arr[0] 是首行(类型为 int[4]),不是指针。
- 错误写法:
sizeof(arr) / sizeof(int*)—— 把arr[0]当成指针,结果错 - 如果数组作为函数参数传入,退化为指针,
sizeof(arr)变成指针大小(通常是 8),完全不可靠 - 多维数组必须所有维度都固定,
int arr[][4]中第一维缺失时,sizeof(arr)无法计算,编译失败
std::vector<:vector>></:vector> 怎么安全取行列数
这是最常用也最推荐的方式,尤其当行、列数运行时才确定。它没有 sizeof 的限制,且自带 .size() 方法。
rows = vec.size();cols = vec.empty() ? 0 : vec[0].size() —— 必须先判空,否则 vec[0] 访问越界。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 不保证每行长度一致:如果手动 push 不同长度的子 vector,
vec[0].size()和vec[1].size()可能不同,这不是“矩形数组” - 想强制矩形结构,建议封装成类,构造时校验所有行长度,或改用一维
vector+ 手动索引:vec[row * cols + col] - 性能上,
vec.size()是 O(1),但频繁调用仍建议缓存到局部变量,避免重复访问
动态分配的二维数组(int**)为什么不能直接获取维度
int** arr 只是一个指向指针的指针,内存布局是分散的:一行 malloc 一块,再把地址存进 arr[i]。C++ 不保存任何维度元信息,sizeof(arr) 返回的是指针大小,毫无意义。
- 常见错误:以为
arr[0]是“第一行数组”,其实它是int*,sizeof(arr[0])是 8,不是列数 - 唯一办法是额外维护两个变量(如
rows,cols),或用结构体打包:struct Mat { int** data; int rows; int cols; }; - 用
new int[rows][cols](不带 *)可以得到连续内存,但返回类型是int (*)[cols],不是int**,且cols必须是常量表达式,实际中极少用
模板函数自动推导静态数组维度(泛型写法)
如果你写工具函数处理不同尺寸的静态数组,可以用模板 + 引用参数避免退化:
template<typename t size_t rows cols>
constexpr size_t get_rows(const T (&)[Rows][Cols]) { return Rows; }
template<typename t size_t rows cols>
constexpr size_t get_cols(const T (&)[Rows][Cols]) { return Cols; }</typename></typename>
调用 get_rows(arr) 会自动推导 Rows 和 Cols,安全且编译期完成。但只适用于实参是数组名本身(非指针、非函数参数)。
- 传入函数参数时,必须声明为引用类型:
void f(int (&arr)[3][4]),写成void f(int arr[3][4])就退化了 - 不能用于
std::vector或int**,它们类型不匹配,编译不过 - 推导出的
Rows/Cols是constexpr,可直接用作模板参数或数组声明尺寸
真正麻烦的地方不在“怎么算”,而在于你得先搞清楚手里的到底是什么:是栈上数组、堆上 int**、还是 vector——类型决定了方法,混用就会崩。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










