首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言數組元素賦值 s2[i]=s1[i] 詳解:從逐個拷貝到 memcpy

     編輯:C 語言問答

語句含義

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)較慢、代碼冗長需邊拷貝邊處理、教學演示
庫函數 memcpymemcpy(s2, s1, n*sizeof(int));極快(編譯器內聯優化、SIMD)、一行搞定純按位拷貝、不支援重疊內存**生產代碼首選**、大數組複製
庫函數 memmovememmove(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。
  • 含指針字段的結構體數組需**深拷貝**,不能直接按位複製。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved