1

重複の可能性:
2D 配列を関数に渡す

私の質問は、配列を C++ 関数の引数として渡すことに関連しています。最初に例を示します。

void fun(double (*projective)[3])
{
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
        {
            projective[i][j]= i*100+j;
        }
}

int main()
{
    double projective[3][3];     

    fun(projective);
    for(int i=0; i<3; i++)
    {
        cout<<endl;
        for(int j=0; j<3; j++)
            cout<<projective[i][j]<<"   ";
    }


    return 0;
}

この例では、渡される引数funは配列であり、この引数を渡す他の方法があるかどうか疑問に思っていました。ありがとう!

4

3 に答える 3

3

funは、array-of-3-doubleへのポインターを受け取り、これが少なくとも3つのarray-of-3-doubleの配列の最初の要素を指していると(呼び出し元に依存して)想定します。あなたが言うように、呼び出しに提供される引数mainは配列であるため、それはそれを行います。これはすぐに最初の要素へのポインタに減衰します。

とにかくサイズが想定されており、呼び出し元が実際にそのような獣を持っているので、1つの代替手段はfundoubleへのポインターを取得することです:

void fun(double (*p_projective)[3][3])
{
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
        {
            (*p_projective)[i][j]= i*100+j;
        }
}

で呼び出しfun(&projective)ます。

于 2012-10-18T08:36:02.340 に答える
1

もしそうなら、配列がdim*dim要素を持つように割り当てられているか宣言されていると仮定して、ベースポインターを使用して自分でオフセットを行うこともできます。

void fun(double *projective, size_t dim)
{
    for(size_t i=0; i<dim; i++)
        for(size_t j=0; j<dim; j++)
            projective[i*dim+j] = i*100+j;
}

int main(int argc, char *argv[])
{
    double ar[5*5];
    fun(ar, 5);
    return 0;
}

これを行う方法はたくさんありますが、これは 1 つだけですが、通常は頭を包むのが最も簡単です (通常、バックエンドには std::vector<> を使用します)。

于 2012-10-18T08:41:10.380 に答える
1

配列をそのまま渡すことはできません。常にポインターに減衰します。ただし、構造体をラップする場合は、配列を渡すことができます。これは C および C++ で機能します。C++ では、配列への参照を渡すことができます。どちらの場合も、配列は固定サイズです。

// as a struct
struct Array
{
  int elems[10];
};

void func(Array a);

// as a reference
void func(int (&a)[10]);
于 2012-10-18T08:32:42.963 に答える