支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-06-18 11:15:38 数组复制 多语言对比 编程基础
把数组复制一份,各语言的写法差别还挺大的,有时候换语言一下子想不起来,干脆整理到一起。
Python 里最直白的就是切片,source_array[:] 直接产生一个新列表,浅拷贝。
平时写脚本基本就这么用了,真需要深拷贝的时候才会想到 copy 模块。
JavaScript 的习惯是用扩展运算符,[...sourceArray] 一行搞定。
以前还用 slice() 或者 concat(),现在有扩展运算符了可读性好很多。不过也得注意,如果数组项是对象,复制出来的还是引用,这是所有语言都一样的。
Java 这边常用的就是 System.arraycopy,得先 new 好目标数组,然后指定源起始位置、目标起始位置、复制长度。这个方法是 native 的,性能不错。
Arrays.copyOf 其实内部也是调用它,只不过帮你把 new 的步骤包了一下,代码更短。
C# 有 Array.Copy,用法跟 Java 的 System.arraycopy 很像,也是静态方法,传源数组、目标数组、长度。另外还有 Clone() 和 ToArray() 这些,不过简单的值类型数组直接用 Copy 足够。
C++ 里推荐的现代写法是用 std::copy,需要引入 <algorithm>。给它源的首尾指针和目标首指针就行。
之前用 C 风格循环不是不行,但用标准库的算法一来更清晰,二来某些容器和迭代器也能复用。顺手提一句,如果只是把一个数组原样复制到另一个同类型数组,也可以用 std::copy_n 或者直接容器赋值,但 std::copy 属于最通用的方式。
C 语言的选择最多,而且有些细节线上出问题才想起来。
最基础的就是写个 for 循环挨个赋值。什么场景都能用,不依赖库函数。
用指针配合循环本质是上一种的变体,*dest++ = *src++,有些人觉得指针写法更 C。没多大区别,看个人习惯。
追求效率一般用 memcpy,直接复制内存块,size 要算对,size * sizeof(int) 别忘了乘类型大小。这里有个坑——如果源和目标内存区域有重叠,memcpy 的行为是未定义的,某些平台上可能正常,换个环境就出 bug。
我一开始也觉得谁没事把重叠的内存往另一块复制,后来在写一些移位操作的时候真遇到过。
所以有了 memmove,用法和 memcpy 几乎一样,但保证了重叠区域也能安全复制。如果拿不准源和目标有没有重叠,直接上 memmove 最省心,虽然性能略低一点点,但这点开销绝大多数场景可以忽略。
写 C 的时候这个习惯养成了能少踩不少坑。
下一篇: MySQL服务启动失败:错误2的排查记录