C言語で配列やメモリ領域の内容をコピーするには string.h の memcpy 関数か memmove 関数を使用します.
#include <string.h>
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);memmove
void *memmove(void *s1, const void *s2, size_t n);
memcpy 関数は s2 が指すオブジェクトから,s1 が指すオブジェクトに n 文字コピーする関数です.なお,領域の重なり合うオブジェクト間でコピーが行われるときの動作は未定義です.
memmove 関数は memcpy 関数とほとんど同じですが,領域の重なり合うオブジェクト間でコピーが行われるときでも正しく動作します.
以下に memcpy 関数を使って int 型の配列をコピーするサンプルプログラムを示します.
/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* macros */
#define N 8
/* main */
int main(void) {
int x1[] = {1, 2, 3, 4, 5, 6, 7, 8};
int x2[N];
int i;
/* メモリ領域内の内容をコピー */
memcpy(x2, x1, sizeof(int) * N);
/* x1 と x2 の各要素を表示 */
for ( i = 0; i < N; i++ ) {
printf("x1[%d]: %d, x2[%d]: %d\n",
i, x1[i], i, x2[i]);
}
return EXIT_SUCCESS;
}
サンプルプログラムの実行結果は以下のようになります.
x1[0]: 1, x2[0]: 1 x1[1]: 2, x2[1]: 2 x1[2]: 3, x2[2]: 3 x1[3]: 4, x2[3]: 4 x1[4]: 5, x2[4]: 5 x1[5]: 6, x2[5]: 6 x1[6]: 7, x2[6]: 7 x1[7]: 8, x2[7]: 8
たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.
C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります.
オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.
ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.