コードを載せるときは、フォーラムルールに従って、
codeタグを使ってください。
#4 でのお願いは、#2 で挙げた 2つのプログラムのうち
1. の配列を使わず、関数だけ使って和を表示するプログラムの
つもりだったんですが、そうは解釈されなかったようですね。
次のような解答を期待していました。
コード:
#include <stdio.h>
int sum_array(int a, int b, int c, int d, int e)
{
return a + b + c + d + e;
}
int main(void)
{
int a, b, c, d, e;
printf("enter five numbers: ");
scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
printf("sum = %d\n", sum_array(a, b, c, d, e));
return 0;
}
これを配列を使って書き直すと、
コード:
#include <stdio.h>
int sum_array(int a[], int n)
{
int sum = 0;
for (int i = 0; i < n; i++)
sum += a[i];
return sum;
}
#define N 5
int main(void)
{
int a[N];
printf("enter five numbers: ");
for (int i = 0; i < N; i++)
scanf("%d", &a[i]);
printf("sum = %d\n", sum_array(a, N));
return 0;
}
配列を使うと、個数を 50個に変更するのも簡単ですね。
配列を使わないと、50個の変数を用意するのは大変です。
さて、配列を関数に引数として渡す仕組みですが、
これは単純変数とは異なっています。
int func(int x) { return x * 2; } という関数があった時、
呼び出し側は、func(3) でも func(i) でも func(i + 3) でも構いません。
引数 x は、呼び出し側の引数の「値」で初期化されます。
配列の場合
コード:
int func2(int v[], int n) { return v[n-1]; }
int main(void)
{
int a[5] = { 3, 14, 15, 92, 65 };
int b = func2(a, 5);
}
配列 a の 5個の値が全部、配列 v にコピーされるわけではありません。
func2(a, 5) の a は、配列の先頭要素へのポインタに変換されます。
すなわち &a[0] です。
func2 の int v[] も int *v と宣言されたのを同じ解釈がされます。
このポインタ変数 v は、&a[0] の「値」で初期化されます。
v[n-1] というのは、*(v +(n-1)) と同じものと解釈され、
呼び出し元の a[5-1] を参照することができます。
func2 の中で v[0] = 7; を実行すると、呼び出し元の a[0] の値を
変更できます。呼び出し元の配列の要素を変更しない場合は、
int func2(const int *, int v) と書いたほうが良いでしょう。
こんな説明で分かっていただけますか?
最初の質問 #1 の 2 のプログラムは書けそうですか?