行数=sizeof(arr)/sizeof(arr[0]),列数=sizeof(arr[0])/sizeof(arr0);需在数组作用域内使用,不可传入函数后调用,仅适用于栈上静态二维数组。

用 sizeof 计算静态二维数组的维度
静态声明的二维数组(如 int arr[3][4])在编译期就确定了大小,sizeof 能直接拿到总字节数,再除以单个元素和某维长度即可反推行列。这是最常见也最可靠的原生方法。
关键点在于:必须在数组作用域内使用(不能传入函数后调用,否则退化为指针);且只能用于栈上分配的固定大小数组。
行数 = sizeof(arr) / sizeof(arr[0])列数 = sizeof(arr[0]) / sizeof(arr[0][0])- 若写成
sizeof(arr) / sizeof(int)也能算出总元素数,但无法区分行列,不推荐
示例:
int arr[5][7]; std::cout << "rows: " << sizeof(arr) / sizeof(arr[0]) << "\n"; std::cout << "cols: " << sizeof(arr[0]) / sizeof(arr[0][0]) << "\n";
传参后无法用 sizeof 获取尺寸的原因
当把二维数组作为参数传给函数时,形参实际是退化为指针(如 void func(int arr[][4]) 中 arr 是 int (*)[4]),sizeof(arr) 返回的是指针大小(通常 8 字节),不再是原数组信息。
- 错误写法:
sizeof(arr) / sizeof(arr[0])在函数内永远返回1(因为sizeof(指针)/sizeof(指针解引用)常为8/8=1或8/4=2,完全不可靠) - 正确做法:必须显式传入行数、列数,或改用
std::array/std::vector
用 std::array 代替原始数组获取尺寸
std::array 是零开销封装,保留了编译期尺寸信息,支持 .size() 和模板推导,比裸数组更安全、更易维护。
立即学习“C++免费学习笔记(深入)”;
-
std::array<:array>, 5> arr;</:array>→ 行数:arr.size(),列数:arr[0].size() - 支持范围 for、迭代器,且不会隐式退化为指针
- 注意:第二维必须是编译期常量,不能写成
std::array<:array n>, M></:array>(除非N、M是constexpr)
动态二维结构该用 std::vector<:vector>></:vector> 吗?
如果行长度不一致(如“三角阵”)、或需要运行时调整大小,std::vector<:vector>></:vector> 是合理选择;但如果所有行等长,它会带来额外指针间接访问开销和内存碎片。
- 行数:
vec.size(),列数(假设非空):vec[0].size()—— 但需先检查!vec.empty() - 更高效替代:一维
std::vector<t></t>手动映射二维索引(vec[row * cols + col]),用封装类隐藏计算逻辑 - 切记:
vec.size()只保证外层数量,vec[i].size()可能各不相同
真正容易被忽略的是:没有一种通用机制能自动从任意“二维数据容器”中无歧义地提取“行列”概念——它本质上依赖你对数据布局的约定。裸数组靠编译期信息,std::array 靠模板参数,std::vector 靠运行时状态,三者语义不同,混用前得想清楚你要的“行”“列”到底代表什么。


















