この記事では、C言語で配列を複製(コピー)する方法を解説します。
配列をコピーするには、for
文で要素を 1つずつ代入するか、memcpy
関数を使うことで簡単に実装することができます。
それでは、サンプルを交えながら配列をコピーする方法を見ていきましょう!
コピーしたい配列の要素をコピー先の配列に 1つずつ代入することで同等の配列を生成することができます。
#include <stdio.h>
// 配列の長さ
#define LENGTH 3
int main(void) {
// 配列の宣言・初期化
int nums[LENGTH] = {1, 2, 3};
int copy_nums[LENGTH];
// 要素を1つずつ代入
for(int i = 0; i < LENGTH; i++){
copy_nums[i] = nums[i];
}
// 出力
for(int i = 0; i < LENGTH; i++){
printf("%d\n", copy_nums[i]);
}
}
実行結果
1
2
3
全ての要素を二倍した配列を生成したいと思ったときも同様の方法で可能です。
#include <stdio.h>
// 配列の長さ
#define LENGTH 3
int main(void) {
// 配列の宣言・初期化
int nums[LENGTH] = {1, 2, 3};
int copy_nums[LENGTH];
// 要素を1つずつ代入
for(int i = 0; i < LENGTH; i++){
// 二倍した要素を代入
copy_nums[i] = nums[i] * 2;
}
// 出力
for(int i = 0; i < LENGTH; i++){
printf("%d\n", copy_nums[i]);
}
}
実行結果
2
4
6
memcpy
関数を使うことで配列をコピーできます。
#include <string.h>
void *memcpy(void *buf1, const void *buf2, size_t n);
memcpy
関数は、buf1
引数に指定したメモリブロックに buf2
引数に指定したメモリブロックを n
引数のバイト数分だけコピーします。
#include <stdio.h>
#include <string.h> // インクルード
// 配列のサイズ
#define LENGTH 3
int main(void) {
// 配列の宣言・初期化
int nums[LENGTH] = {1, 2, 3};
int copy_nums[LENGTH];
// コピー
memcpy(copy_nums, nums, sizeof(nums));
// 出力
for(int i = 0; i < LENGTH; i++){
printf("%d\n", copy_nums[i]);
}
}
実行結果
1
2
3
特定の要素のみコピーしたい場合は、n
引数に sizeof(要素の型) * コピーしたい要素数
を指定するか、
#include <stdio.h>
#include <string.h> // インクルード
// 配列のサイズ
#define LENGTH 3
// コピー先の配列のサイズ
#define COPY_LENGTH 2
int main(void) {
// 配列の宣言・初期化
int nums[LENGTH] = {1, 2, 3};
int copy_nums[COPY_LENGTH];
// コピー
memcpy(copy_nums, nums, sizeof(int) * 2);
// 出力
for(int i = 0; i < COPY_LENGTH; i++){
printf("%d\n", copy_nums[i]);
}
}
実行結果
1
2
buf2
引数にコピー元の配列を指定する際、コピーを開始したい要素のポインタを渡すことで実装することができます。
#include <stdio.h>
#include <string.h> // インクルード
// 配列のサイズ
#define LENGTH (3)
// コピー先の配列のサイズ
#define COPY_LENGTH 2
int main(void) {
// 配列の宣言・初期化
int nums[LENGTH] = {1, 2, 3};
int copy_nums[COPY_LENGTH];
// コピー
memcpy(copy_nums, &nums[1], sizeof(int) * 2);
// 出力
for(int i = 0; i < COPY_LENGTH; i++){
printf("%d\n", copy_nums[i]);
}
}
実行結果
2
3
このように、memcpy
関数を使うことで簡単に配列をコピーすることができました。