C言語で配列を使って代入する方法
- 作成日: 2024-03-12
- 更新日: 2024-03-12
- カテゴリ: C言語
C言語の配列で要素に代入したり配列を変数に代入したりする場合、どうすればいいのか?
というところをこの記事では解説していきます。
解説している人はC言語歴17年以上のベテラン開発者です。
C言語や他の言語を扱うYoutubeも公開しています。
興味がある方は以下のリンクからご覧ください。
関連記事
C言語の配列の書き方
配列の要素に値を代入する
配列の要素に値を代入する方法を見ていきます。
代入
配列の要素に代入するにはまず配列を添え字で参照し、要素を指定します。
それから=
代入式を書いて右側に代入したい値を書きます。
int ary[3];
ary[0] = 1;
ary[1] = 2;
ary[2] = 3;
配列の要素の添え字は0
から始まりますので、一番最初の要素は0
です。
そこから1
、2
と増えていきます。
上記の場合はint ary[3];
で要素数が3つの配列ary
を宣言しています。
ですので添え字で参照できる要素は3つまでです。
上記の配列はint
型の配列なので要素に代入する値はint
型である必要があります。
int
型ではない値を代入する場合は暗黙的な型変換が行われます。
暗黙的な型変換はバグを誘発することもありますので、注意した方がいいでしょう。
加算代入
加算代入をしたい場合は+=
演算子を使います。
int ary[] = {1, 2, 3};
ary[0] += 10;
ary[1] += 10;
ary[2] += 10;
上記の場合は配列はint ary[] = {1, 2, 3};
で初期化しています。
これはary[0] == 1
でary[1] == 2
でary[2] == 3
になります。
このそれぞれの要素に10
を加算代入します。
すると各要素は10加算された結果になります。
減算代入
減算代入したい場合は-=
演算子を使います。
int ary[] = {1, 2, 3};
ary[0] -= 10;
ary[1] -= 10;
ary[2] -= 10;
配列の各要素から10
引く(減算)します。
乗算代入
乗算代入したい場合は*=
演算子を使います。
int ary[] = {1, 2, 3};
ary[0] *= 10;
ary[1] *= 10;
ary[2] *= 10;
各要素を掛け算しますのでary[0]
の場合は1 * 10
の結果になります。
ary[1]
の場合は2 * 10
の結果に。
ary[2]
の場合は3 * 10
の結果になります。
除算代入
徐算代入したい場合は/=
演算子を使います。
int ary[] = {10, 20, 30};
ary[0] /= 10;
ary[1] /= 10;
ary[2] /= 10;
上記の場合はary[0]
は10 / 10
という計算結果に。
ary[1]
は20 / 10
という結果になります。
ary[2]
は30 / 10
です。
徐算は割り算ですので0
で割ることはできないので注意してください。
たとえば
ary[0] /= 0;
というのはダメです。
これは処理系によっては浮動小数点例外
になります。
剰余算代入
割り算の余りを求めることを剰余を求めると言います。
剰余算代入は%=
演算子で行います。
int ary[] = {1, 2, 3};
ary[0] %= 10;
ary[1] %= 10;
ary[2] %= 10;
上記の場合はary[0]
は1 % 10
になります。
ary[1]
は2 % 10
です。
ary[2]
は3 % 10
です。
1
を10
で割った余りは1
です。
2
は2
で、3
も3
です。
11
を10
で割った余りは1
になります。
剰余算も0
で計算できないので注意してください。
たとえば
ary[0] %= 0;
というのはダメです。
配列の要素を変数に代入する
配列の要素を別の変数に代入したい場合は以下のように行います。
int ary[] = {1, 2, 3};
int two = ary[1];
printf("%d\n", two); // 2
上記の場合はary[1]
で配列ary
の1番目の要素を参照して、two
という変数に代入しています。
ary[1]
には値2
が入っていますので、two
に2
が入ります。
配列の要素のアドレスをポインタ変数に代入する
配列の要素のアドレスを&
演算子で取り出してそれをポインタ変数に代入します。
int ary[] = {1, 2, 3};
int *p = &ary[1];
*p += 10;
printf("%d %d", *p, ary[1]); // 12 12
&ary[1]
というのがary
の1
番目の要素のアドレスを取り出しているところです。
&
がアドレスの取り出し、ary[1]
が要素の参照です。
この取り出したアドレスをp
に代入して、そのあとに*p += 10
でp
の実体を加算しています。
p
の実体はary[1]
ですのでary[1]
も間接的に値が変更されます。
結果は*p
もary[1]
も値は12
になります。
配列をポインタ変数に代入する
配列自体はポインタ変数に代入できます。
int ary[] = {1, 2, 3};
int *p = ary;
printf("%d\n", p[0]); // 1
printf("%d\n", p[1]); // 2
printf("%d\n", p[2]); // 3
上記の場合はary
が配列で、p
がポインタ変数です。
p
からは添え字で配列の要素にアクセスできます。
この代入は配列のコピーが行われているわけではありません。
あくまで配列のアドレスをポインタに入れて、ポインタから間接的に配列の要素を参照しているだけです。
また配列ary
はsizeof
で配列全体のサイズが求まります。
しかしp
の方はsizeof
で配列ではなくポインタのサイズが求まりますので注意してください。
関連記事
C言語の配列とポインタについて
関数の引数に配列を渡す
関数の引数に配列を渡すのは代入ではありませんが、代入と近しい動作です。
void func(int ary[]) {
printf("%d\n", ary[0]);
printf("%d\n", ary[1]);
printf("%d\n", ary[2]);
}
void func_test(void) {
int ary[] = {1, 2, 3};
func(ary);
}
関数の引数の宣言はint ary[]
のように行います。
これは一見すると配列のように見えますが実際はポインタと一緒です。
つまりint *ary
と同じ意味になります。
ですのでこの引数ary
のsizeof
もポインタのサイズが求まります。
関数内ではary
から間接的にfunc_test()
内のary
を参照できます。
関連記事
C言語で関数に配列を渡す方法