9

動的にサイズ変更された配列を別の関数に渡す最も「適切な」方法は何ですか?

bool *used = new bool[length]();

コンパイルするいくつかの方法を思いつきましたが、正しい方法が何であるかについてはよくわかりません。

例えば

これらは値渡しでしょうか?

static void test(bool arr[])

static void test(bool *arr)

これは参照渡しでしょうか?

static void test(bool *&arr)

ありがとう

4

5 に答える 5

12

実際には、最初の 2 つのアイデアはアドレスで配列を渡し、3 つ目は参照で配列を渡します。これを確認するための小さなテストを考案できます。

void test1(int* a) {
    a[0] = 1;
}

void test2(int a[]) {
    a[1] = 2;
}

void test3(int *&a) {
    a[2] = 3;
}

int main() {
    int *a = new int[3]();
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;

    test1(a);
    test2(a);
    test3(a);

    cout << a[0] << endl;
    cout << a[1] << endl;
    cout << a[2] << endl;
}

このテストの出力は

1
2
3

パラメーターが値で渡される場合、変更は関数のスコープ内にとどまるため、関数内で変更することはできません。C++ では、配列を値で渡すことはできないため、この動作を模倣するには、aconst int*または aconst int[]をパラメーターとして渡す必要があります。そうすれば、配列が参照渡しされても、constプロパティのために関数内で変更されることはありません。

あなたの質問に答えるには、好ましい方法は a を使用するstd::vectorことですが、どうしても配列を使用したい場合は、 を使用する必要がありますint*

于 2012-10-22T06:59:45.490 に答える
4

あなたが正しい。最初の 2 つは同等で、ポインタを値渡しします。文体的には、状況を正確に表す 2 番目の方法が好まれます。つまり、関数へのポインターを渡します。1 つ目は、C++ で配列を渡すことができないと信じられない人にとっては一種の二日酔いです。C++ では配列を値で渡す方法はありません。3 番目は参照によってポインターを渡します。

ここでは、すべての場合にポインターが配列を「参照」するという混乱があります。したがって、値渡しまたは参照渡しについて話すときは、ポインターについて話しているのか、それが参照する配列について話しているのかを明確にする必要があります。

于 2012-10-22T06:53:13.397 に答える
2
static void test(bool arr[])
static void test(bool *arr, size_t size)

静的/動的配列の場合、このポインターの位置を変更したくない場合。

例: http://liveworkspace.org/code/c5e379ebe2a051c15261db05de0fc0a9

static void test(bool *&arr)

場所を変更したい場合は動的に。

例: http://liveworkspace.org/code/bd03b214cdbe7c86c4c387da78770bcd

ただし、C++ で記述しているため、生の動的配列の代わりにベクトルを使用してください。

于 2012-10-22T06:54:33.213 に答える
1

これを使って:

void myFuncThatAcceptsDynamicArrays(bool* array, int size) {
   // Do something (using the size as the size of the array)
}

有効なサイズを指定するのは関数のユーザー次第です (これは非常に危険です)。

于 2012-10-22T06:55:55.427 に答える
0

動的サイズの配列には常にベクトルを使用します。すべての場合において、C ++の配列は、ポインターアドレスのみが渡されるため、参照によって渡されます。配列の場合、値を渡すための基本的な方法はありません。

于 2012-10-22T07:31:37.757 に答える