ユーニックス総合研究所

  • home
  • archives
  • c-hairetsu-dainyu

C言語で配列を使って代入する方法

  • 作成日: 2024-03-12
  • 更新日: 2024-03-12
  • カテゴリ: C言語

C言語の配列で要素に代入したり配列を変数に代入したりする場合、どうすればいいのか?
というところをこの記事では解説していきます。

解説している人はC言語歴17年以上のベテラン開発者です。

C言語や他の言語を扱うYoutubeも公開しています。
興味がある方は以下のリンクからご覧ください。

Youtubeの当チャンネル

関連記事
C言語の配列の書き方

配列の要素に値を代入する

配列の要素に値を代入する方法を見ていきます。

代入

配列の要素に代入するにはまず配列を添え字で参照し、要素を指定します。
それから=代入式を書いて右側に代入したい値を書きます

int ary[3];  

ary[0] = 1;  
ary[1] = 2;  
ary[2] = 3;  

配列の要素の添え字は0から始まりますので、一番最初の要素は0です。
そこから12と増えていきます。
上記の場合は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] == 1ary[1] == 2ary[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です。

110で割った余りは1です。
22で、33です。
1110で割った余りは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が入っていますので、two2が入ります。

配列の要素のアドレスをポインタ変数に代入する

配列の要素のアドレスを&演算子で取り出してそれをポインタ変数に代入します。

int ary[] = {1, 2, 3};  
int *p = &ary[1];  
*p += 10;  
printf("%d %d", *p, ary[1]);  // 12 12  

&ary[1]というのがary1番目の要素のアドレスを取り出しているところです。
&がアドレスの取り出し、ary[1]が要素の参照です。

この取り出したアドレスをpに代入して、そのあとに*p += 10pの実体を加算しています。
pの実体はary[1]ですのでary[1]も間接的に値が変更されます。
結果は*pary[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からは添え字で配列の要素にアクセスできます。
この代入は配列のコピーが行われているわけではありません。
あくまで配列のアドレスをポインタに入れて、ポインタから間接的に配列の要素を参照しているだけです。

また配列arysizeofで配列全体のサイズが求まります。
しかし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と同じ意味になります。
ですのでこの引数arysizeofもポインタのサイズが求まります。

関数内ではaryから間接的にfunc_test()内のaryを参照できます。

関連記事
C言語で関数に配列を渡す方法