演習課題「配列を受け取る関数をつくろう」
要素数が 3 の配列を受け取り、その合計を返す「sum 関数」を作成してください。
プログラムを実行して、正しく表示されれば演習課題クリアです!
期待する出力値
8
172
1660
#07:関数の引数で配列を受け取ろう
関数の引数で配列を受け取る方法について学習します。
#include <stdio.h>
int main(void)
{
int a[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("%d\n", a[i]);
}
}
1. 引数で配列を受け取る関数は次のように定義できます。void add_one(int a[])
{
for (int i = 0; i < 5; i++) {
a[i]++;
}
}
2. これは、以下のように書くこともできます。void add_one(int *a)
{
for (int i = 0; i < 5; i++) {
a[i]++;
}
}
1 と 2 のどちらの方法で記述しても問題ありません。
※配列の要素数を指定することもできます。ただし、この要素数は無視されます。void add_one(int a[10]) // この 10 の値は無視される
{
for (int i = 0; i < 5; i++) {
a[i]++;
}
}
前回のチャプターでは、
「引数に変数を指定すると、値のコピーが渡されるので、変数の値そのものを書き換えることができない」
ということを学習しました。
しかし、今回は値を書き換えることができています。int a[] = {1, 2, 3, 4, 5};
add_one(a); //=> a 配列の中身が 2 3 4 5 6 になる
a 変数を渡しただけで配列の要素を書き換えられた理由は、a 変数が「配列の先頭の要素のポインタ」に読み替えられるためです。
add_one 関数は、渡されたポインタをもとに、配列の要素の値を書き換えることができます。
※先頭の要素のポインタを渡すだけで、他の要素も書き換えることができます。
これは、配列のそれぞれの要素のアドレスが、
・配列の先頭の要素のアドレス
・配列のデータ型
によって 1 つに決まるためです。
このチャプターで作成したコードです。// 配列を受け取る関数をつくろう
#include <stdio.h>
void print(int a[])
{
for (int i = 0; i < 5; i++) {
printf("%d\n", a[i]);
}
}
void add_one(int a[])
{
for (int i = 0; i < 5; i++) {
a[i]++;
}
}
int main(void)
{
int a[] = {1, 2, 3, 4, 5};
add_one(a);
add_one(a);
print(a);
}