s2[i] = s1[i]; 將數組 s1 下標 i 的元素值,**按位拷貝** 到數組 s2 同下標位置。通常放在迴圈中實現整個數組的複製:
for (int i = 0; i < n; i++) {
s2[i] = s1[i];
}
i=0: s2[0] ← s1[0]
i=1: s2[1] ← s1[1]
...
i=n-1: s2[n-1] ← s1[n-1]
每次迴圈只處理**一個元素**,屬於標量賦值操作。
| 方式 | 代碼 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 逐元素賦值 | for(i=0;i | 直觀、可在拷貝時加工(如 *2) | 較慢、代碼冗長 | 需邊拷貝邊處理、教學演示 |
| 庫函數 memcpy | memcpy(s2, s1, n*sizeof(int)); | 極快(編譯器內聯優化、SIMD)、一行搞定 | 純按位拷貝、不支援重疊內存 | **生產代碼首選**、大數組複製 |
| 庫函數 memmove | memmove(s2, s1, n*sizeof(int)); | 支援源/目標重疊、安全 | 極微小性能損耗 | 重疊區域複製(如數組插入/刪除移位) |
s1、s2 必須同類型或兼容類型(如 int[] → int[]),否則需強轉或逐字段賦值。i < n 且 s2 容量 ≥ n,防越界。memcpy 均可整體複製結構體(含嵌套數組),但若結構體含**指針字段**屬淺拷貝,需深拷貝。char s2[100]; strcpy(s2, s1); 自動處理 \0 結尾,**禁用 memcpy** 複製字符串(除非明確知長度)。現代編譯器(GCC/Clang -O2 以上)會自動將簡單的逐元素迴圈**向量化**或直接替換為 memcpy 內聯代碼。因此手寫迴圈在釋放版性能通常與 memcpy 持平,但 memcpy 意圖更清晰、不易出錯。
s2[i]=s1[i] 是**單元素賦值**,配合迴圈實現數組複製。memcpy(dest, src, n*sizeof(type))**:快、短、標準。memmove,字符串用 strcpy/strncpy。