2012-10-29 9 views
5

C/C++の配列変数

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

に私は思ったんだけどとして我々は、C/C++の関数ヘッダで変数として配列を渡すことができます。何かが内部に入ること、それが今まで可能です関数ヘッダーに渡される変数に[]が含まれているか、または常に空ですか? 1次元配列のための

+1

参照、配列へのポインタ、または多次元配列を使用するまでは違いはありません。 – chris

+0

CとC++では違います。 CはVLAを有する。 C++にはテンプレートがあります。 –

+1

* "C/C++関数ヘッダーの変数として配列を渡すことができます。*" - Nope。あなたの例では、関数は配列ではなく最初の要素へのポインタを取得します。自分で試してみてください。 'sizeof arr == sizeof int *'、常に。 –

答えて

10

を保持し、関数シグネチャR foo(T t[])及びR foo(T t[123])(または任意の他の数)R foo(T * t)と同一であり、アレイは、第一のアドレスを渡すことによって渡されます素子。

Tは、それ自体がT = U[10]のような配列タイプでもよいことに注意してください。

+1

+1を抽象化します。私はそれを聞いたことがない、それは良いです。 – chris

2

、それは常に空になり、ブラケットは執筆の別の方法です:二次元配列については

int fun(int * arr) 
{ 

} 

、あなたは各要素自体どのように多くの要素を指定する必要があります任意の(非参照)Tを入力するため

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

} 
+2

ブラケットの間に数字を入れることができます。たとえ1次元であっても、コンパイラはそれを無視します。 – imreal

2

int func(int arr []){...} は、関数に渡される配列の無効なdeclerationです。

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

int func(int * arr){...} は配列の開始アドレスを関数に渡します配列を使用してください。

元の配列を元の状態に保つ必要がある場合は、配列のコピーを関数内で使用して&にすることができます。アレイの

+0

該当しません。これは有効なコードです。 – Acorbe

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つを言及します。これは、要素の数が指定されていなくても、ポインタではなく配列を定義します。別のソースファイルのarrint *arr;と参照するのはエラーです(しかし、診断する必要はありません)。