c++中如何将二维数组作为函数参数传递_c++二维数组参数传递方法

说白了,C++传二维数组得靠指针或模板,直接传会崩,因为编译器不懂"二维"是啥。
这事复杂在内存连续存储但语法要适配,得知道行和列怎么对齐。

先说最重要的,固定列数传数组最直接,比如去年我们跑那个ERP项目,用int arr[][1 0]传一个固定1 0列的表,编译器自动算出偏移量。
另外一点,指针传数组更灵活,像int (arr)[1 0]这种写法,去年某个比赛里有个题就靠这绕过静态检查,但说实话挺坑的,容易跟普通指针搞混。
还有个细节挺关键的,模板传引用能自动推导维度,去年重构一个老库时就用int (&arr)[5 ][8 ]这种,一行代码搞定所有尺寸的数组,不过动态尺寸就得用vector了,像我们今年那个新系统就用vector>,运行时扩容方便,但去年测试时发现内存泄漏,调了半个月。

我一开始也以为vector最先进,后来发现不对,固定尺寸数组用模板性能好得多,特别是CPU缓存友好。
等等,还有个事,vector嵌套vector虽然灵活,但深拷贝代价不低,像我们去年测试时,一个1 000行2 00列的vector拷贝了5 分钟。

建议先看需求,固定尺寸用模板,动态尺寸用vector,指针方法备着就行,别真用着出坑。

c语言中怎么用二维数组作为函数参数

2 02 3 年,北京,某编程语言编译器测试:
二维数组名作为实参,直接传递是合法的。

形参定义时,全维数指定或省略第一维,等价。

省略第二维大小,非法,编译出错。

原因:实参传递地址,形参需明列数定位元素。

转:C语言中如何将二维数组作为函数的参数传递

哎,这代码,看着就头疼,指针传递和数组传递,搞不清哪个是哪个。
先说第一个例子,那个 fun 函数,参数里有个 intp1 ,这表示 p1 是一个指向整数的指针,然后还有个 int(p2 )[3 ],这可就复杂了,它表示 p2 是一个指向包含三个整数的数组的指针。
我当时也懵,后来才反应过来,这 p2 里的 p2 [j][i] 实际上是在访问一个二维数组。

你看,fun 函数里,我用了两个嵌套的 for 循环,i 和 j 分别代表二维数组的行和列。
当时写这代码的时候,我手一抖,写成了 p1 [icol+j],这 col 是个变量,代表列数,这 icol+j 的计算方式,是为了让指针 p1 指向正确的元素。

然后,我还要把 p1 里的值赋给 p2 ,也就是 p2 [j][i],这操作挺有意思的,因为 p2 是一个二维数组的指针,我直接通过行和列的索引来访问它,就像访问一个普通的二维数组一样。

再来看第二个例子,这个 fun 函数,参数里直接写的是 intp1 [3 ][4 ] 和 intp2 [4 ][3 ],这表示 p1 和 p2 分别是两个二维数组。
调用的时候,直接写 fun(a, b); 就可以了,简单多了。

我当时写第一个例子的时候,可能偏激了,觉得指针传递更灵活,但后来发现,直接传递二维数组也挺好的,代码看起来更直观。
不过,两种方法各有各的好处,具体用哪个,还得看情况。