分幾種情況:
1.字符數組
使用strcpy
2.int,float,double等數組
使用memcpy,如復制一個長度為5 的 float數組,則代碼示例如下
int len = 5;
float a[len] = {1.0 ,1.1, 1.2, 1.3, 1.4};
float b[len];
memset(b, 0, len*sizeof(float));
memcpy(b, a, len * sizeof(float));
注意,第三個參數不是指數組個數,而是指要復制的數據的總字節數長度。
3.對象數組
不能使用以上兩種,需要實現拷貝構造函數或賦值重載函數。
C++ 風格的復制操作
使用STL中的copy算法
int a[] = {1,2,3,4,5};
int b[5];
std::copy(std::begin(a),std::end(a),std::begin(b));
for(auto e:b) cout<<e<<" "; // 輸出 1,2,3,4,5
上述程序中,copy算法將數組a區間中的數復制到以begin(b)開始的區間中去.
使用array容器 (C++11)
std::array<int,5> arr = {1,2,3,4,5};
std::array<int,5> copy;
copy = arr; // 將arr中的元素復制到copy中
arr[0] = 100;
for(auto e:copy) cout<<e<<" "; //輸出 1,2,3,4,5
C 風格的復制操作
使用memcpy()
int arr[] = {1,2,3,4,5};
int copy[5];
int len = sizeof(arr) / sizeof(arr[0]);
memcpy(copy,arr,len*sizeof(int)); // 輸出 1,2,3,4,5
for(auto e:copy) cout<<e<<" ";
注意:memcpy()函數的第三個參數表示的是要復制的字節數,而不是要復制的元素數目。至於這樣做的原因,可以先來看memcpy()的原型:
void* memcpy(void* destination,const void* source,size_t num);
由memcpy()的函數原型可以看到,該函數的前兩個參數的類型是void*類型,這樣做是為了使memcpy()可以作用於任何類型的指針。
但這樣做又導致了一個問題,即memcpy()不知道傳入數組的每個元素用多少字節來表示。也正是因為這個原因,使得memcpy()的第三個參數不能是要復制的元素個數,而是要復制的字節數。
使用memmove()
該函數與memcpy()類似,只是memmove允許目的位置和源位置重疊,示例如下:
int arr[] = {1,2,3,4,5,6,7,8};
memmove(arr+3,arr+1,sizeof(int)*5);
for(auto e:arr) cout<<e<<" "; // 輸出 1,2,3,2,3,4,5,6
注意:上面的程序中,如果將memmove()換作memcpy()可能也會正常工作,但是這種行為是不可預計的,當目的位置與源位置存在重疊時,應當使用memmove()。
測試實例
#include <iostream>
using namespace std;
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int b[10] = { 0 };
int c[10] = { 0 };
//copy
copy(begin(a), end(a), begin(b));
for (auto i : b)
cout << i << " ";
cout << endl;
//memcpy
memcpy(c, a, sizeof(a));
for (auto i : c)
cout << i << " ";
cout << endl;
//memmove
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
memmove(arr + 3, arr + 1, sizeof(int)* 5);
for (auto e : arr)
cout << e << " ";
cout << endl;
system("pause");
return 0;
}
運行結果: