9

以下の2つの関数test1とtest2の間に違いはありますか

static int const MAXL = 3;

void test1(int t[MAXL])
{
    for (int i = 0; i < MAXL; ++i)
        t[i] = 10;   
}

void test2(int (&t)[MAXL])
{
   for (int i = 0; i < MAXL; ++i)
       t[i] = 10;    
}

MSVC2008 でのテストでは、両方の関数が入力配列の値を変更します。どちらの機能も機能的には同じようです。

関数パラメーターで配列への参照が必要なケースを誰か教えてもらえますか?

4

1 に答える 1

7

最初のものは配列の最初の要素へのポインタに崩壊し、2 番目のものは配列への実際の参照です。

ポインターと参照が一般的に異なるのと同じように、それらは異なります。

具体的には、配列の場合、配列のサイズを決定する機能を保持しているため、配列への参照が役立ちます。これにより、C API の場合のように、配列のサイズ/長さを別のパラメーターとして渡す必要がなくなります。

これを実装する方法の 1 つは、特に巧妙だと思いますが、テンプレートを使用します。テンプレート パラメーターを使用すると、配列のサイズをコンパイラーに自動的に推測させることができます。例えば:

void ProcessArray(int* pArray, std::size length)
{
    for (std::size_t i = 0; i < length; ++i)
    {
        // do something with each element in array      
    }
}

template <std::size_t N>
void ProcessArray(int (&array)[N])
{
    ProcessArray(array, N);  // (dispatch to non-template function)
}
于 2013-07-10T03:33:46.150 に答える