配列は値で渡されないので、これは間違っていませんか?
その通り。Cでは値で配列を渡すことはできません。
私は本の引用された部分を調べました、そしてこの混乱または間違いの原因はかなり速く見つけられます。
作者は、それが関数のパラメーターとして提供された場合*i
と同等であることを知りませんでした。i[]
後者の形式は、コードのリーダーを明示的に示すために考案されi
ました。配列は、この質問でよく示されているように、混乱の大きな原因です。
私が面白いと思うのは、本の特定の部分の著者または他の部分の少なくとも1つ(本には合計5人の著者がいるため)、または7人の校正者の1人が少なくとも文に言及していなかったことです。
"関数が呼び出されると、配列のアドレスを次のように渡します:byval_func()
byval_func()
"
少なくともそれで、彼らは対立があることに気づいたはずです。住所を渡すので、それはただの住所です。アドレスをまったく新しい配列に変える魔法のようなことは何も起こりません。
しかし、質問自体に戻りましょう。
すでに自分自身を知っているように見えるので、Cの値で配列をそのまま渡すことはできません。しかし、あなたは3つのことをすることができます(もっとあるかもしれませんが、それは私の実際のステータスです)、それはユニークなケースに応じて代替となるかもしれません、それで始めましょう。
- 配列を構造体にカプセル化します(他の回答で言及されているように):
#include <stdio.h>
struct a_s {
int a[20];
};
void foo (struct a_s a)
{
size_t length = sizeof a.a / sizeof *a.a;
for(size_t i = 0; i < length; i++)
{
printf("%d\n",a.a[i]);
}
}
int main()
{
struct a_s array;
size_t length = sizeof array.a / sizeof *array.a;
for(size_t i = 0; i < length; i++)
{
array.a[i] = 15;
}
foo(array);
}
- ポインタを渡すだけでなく、配列のサイズを決定するためのパラメータを追加します。呼び出された関数には、そのサイズ情報を使用して新しい配列が作成され、呼び出し元の配列の値が割り当てられます。
#include <stdio.h>
void foo (int *array, size_t length)
{
int b[length];
for(size_t i = 0; i < length; i++)
{
b[i] = array[i];
printf("%d\n",b[i]);
}
}
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
foo(a,(sizeof a / sizeof *a));
}
- ローカル配列を定義することを避け、グローバルスコープで1つの配列を使用するだけです。
#include <stdio.h>
int a[10];
size_t length = sizeof a / sizeof *a;
void foo (void)
{
for(size_t i = 0; i < length; i++)
{
printf("%d\n",a[i]);
}
}
int main()
{
for(size_t i = 0; i < length; i++)
{
a[i] = 25;
}
foo();
}