web-dev-qa-db-ja.com

配列はどのように渡されますか?

配列はデフォルトでrefまたはvalueによって渡されますか?ありがとう。

それらはポインタとして渡されます。これは、配列サイズに関するすべての情報が失われることを意味します。 std :: vectorを使用することをお勧めします。これは、選択に応じて値または参照で渡すことができるため、すべての情報を保持します。

配列を関数に渡す例を次に示します。 sizeof(p)はポインタのサイズを与えるので、要素の数を具体的に指定する必要があることに注意してください。

int add( int * p, int n ) {
   int total = 0;
   for ( int i = 0; i < n; i++ ) {
       total += p[i];
   }
   return total;
}


int main() {
    int a[] = { 1, 7, 42 };
    int n = add( a, 3 );
}
29
anon

まず、配列のコピーが作成されるという意味で、値で配列を渡すことはできません。その機能が必要な場合は、std::vectorまたはboost::arrayを使用してください。

通常、最初の要素へのポインタは値によって渡されます。このプロセスでは配列のサイズが失われるため、個別に渡す必要があります。次の署名はすべて同等です。

void by_pointer(int *p, int size);
void by_pointer(int p[], int size);
void by_pointer(int p[7], int size);   // the 7 is ignored in this context!

参照渡しする場合、サイズは次のタイプの一部です。

void by_reference(int (&a)[7]);   // only arrays of size 7 can be passed here!

多くの場合、参照渡しとテンプレートを組み合わせるため、静的に既知のさまざまなサイズで関数を使用できます。

template<size_t size>
void by_reference(int (&a)[size]);

お役に立てれば。

26
fredoverflow

配列は特別です。配列の最初の要素へのポインタとして常に渡されます。

6
Thomas Bonini