まぬねこの足跡。。。

備忘録+たのしさ+ひっそりと

C言語 配列

配列

同じ型の変数を複数連続でつなげたもの。番号(index)で管理。

配列の宣言

型名 配列名[要素数];

int A[100];

初期化+宣言

int A[5] = { 11, 22, 33 }; ←A[0]~A[2]まで初期化、他はデフォルトで0初期化
for (int i = 0; i < 5; i++){
    printf("A[%d] = %d\n", i, A[i]);
} 

表示イメージ

A[0] = 11
A[1] = 22
A[2] = 33
A[3] = 0
A[4] = 0

要素

配列のバイト数

sizeof(変数か配列名)

int A[5];
printf("%lu\n",sizeof(A));

表示イメージ

20

素数

sizeof(A) / sizeof(A[0])

int A[5];
printf("%lu\n",sizeof(A) / sizeof(A[0]));

表示イメージ

5

配列のコピー

memcpy(コピー先配列名、コピー元配列名、配列全体のサイズ);
#include <memory.h>を指定。
注意:コピー先と元のサイズを気にしないので、バッファオーバーランを引き起す時がある。

ちょこっとメモ

バッファオーバーラン

コピー先サイズ<コピー元サイズの時、
コピー元の余ったデータが他のデータを上書きしてしまい、エラーを起こすこと。


int array1[] = { 99, 88, 77, 66, 55 };
int array2[] = { 1, 2, 3, 4, 5 };

printf("*** 変更前 ***\n");
for (int i = 0; i < sizeof(array2) / sizeof(array2[0]); i++) {
    printf("array2[%d] = %d\n", i, array2[i]);
}

memcpy(array2, array1, sizeof(array1));

printf("*** 変更後 ***\n");
for (int i = 0; i < sizeof(array2) / sizeof(array2[0]); i++) {
    printf("array2[%d] = %d\n", i, array2[i]);
}

表示イメージ

*** 変更前 ***
array2[0] = 1
array2[1] = 2
array2[2] = 3
array2[3] = 4
array2[4] = 5
*** 変更後 ***
array2[0] = 99
array2[1] = 88
array2[2] = 77
array2[3] = 66
array2[4] = 55