次のように、C /C++関数ヘッダーで変数として配列を渡すことができます。
int func(int arr[]) { ... }
私は疑問に思っています:[]
関数ヘッダーに渡される変数の中に何かが入る可能性はありますか、それとも常に空ですか?
任意の(非参照)タイプT
の場合、関数のシグネチャ R foo(T t[])
およびR foo(T t[123])
(またはその他の数値)はと同じR foo(T * t)
であり、配列は最初の要素のアドレスを渡すことによって渡されます。
T
それ自体が。などの配列型である可能性があることに注意してくださいT = U[10]
。
1次元配列の場合、常に空になります。角かっこは別の書き方です。
int fun(int * arr)
{
}
2次元配列の場合、各要素自体が保持する要素の数を指定する必要があります
int fun(int arr[][3])
{
}
int func(int arr []){...}は、関数に渡された配列の無効なデクレレーションです。
配列名はポインタ変数です。したがって、配列名(それ自体がポインタ)を渡すだけで十分です。
int func(int * arr){...}は、配列を使用できるように、配列の開始アドレスを関数に渡します。
元の配列をそのまま保持する必要がある場合は、配列のコピーを作成して関数内で使用できます。
配列の名前は、ほとんどのコンテキストで最初の要素へのポインターになります。だからあなたが書くとき
void f(int arr[]);
void g(int arr[42]);
名前arr
はintへのポインタになります。2つの宣言は、次のものと同等です。
void f(int *arr);
void g(int *arr);
名前が減衰しない2つの場所は、配列の定義との引数sizeof
です。したがって、グローバルスコープでのこの宣言は、intへのポインタを定義しません。
int arr[];
これは簡単な間違いであり、追跡するのが難しいため、この特定の1つについて説明します。これは、要素の数が指定されていなくても、ポインターではなく配列を定義します。arr
別のソースファイルからを参照するのはエラーです(ただし、診断する必要はありません)int *arr;
。