5

次のように、C /C++関数ヘッダーで変数として配列を渡すことができます。

int func(int arr[]) { ... }

私は疑問に思っています:[]関数ヘッダーに渡される変数の中に何かが入る可能性はありますか、それとも常に空ですか?

4

4 に答える 4

10

任意の(非参照)タイプTの場合、関数のシグネチャ R foo(T t[])およびR foo(T t[123])(またはその他の数値)はと同じR foo(T * t)であり、配列は最初の要素のアドレスを渡すことによって渡されます。

Tそれ自体が。などの配列型である可能性があることに注意してくださいT = U[10]

于 2012-10-29T23:39:57.693 に答える
3

1次元配列の場合、常に空になります。角かっこは別の書き方です。

int fun(int * arr)
{

}

2次元配列の場合、各要素自体が保持する要素の数を指定する必要があります

int fun(int arr[][3])
{

}
于 2012-10-29T23:35:24.583 に答える
3

int func(int arr []){...}は、関数に渡された配列の無効なデクレレーションです。

配列名はポインタ変数です。したがって、配列名(それ自体がポインタ)を渡すだけで十分です。

int func(int * arr){...}は、配列を使用できるように、配列の開始アドレスを関数に渡します。

元の配列をそのまま保持する必要がある場合は、配列のコピーを作成して関数内で使用できます。

于 2012-10-30T10:58:47.200 に答える
0

配列の名前は、ほとんどのコンテキストで最初の要素へのポインターになります。だからあなたが書くとき

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;

于 2012-10-30T12:55:13.053 に答える