7

私はC++にかなり慣れていないので、最近この問題に遭遇しました。

このコードは明らかに動作します:

void setvalues(int *c, int *d)
{
    (*c) = 1;
    (*d) = 2;
}
int main()
{
    int a, b;
    setvalues(&a, &b);
    std::cout << a << b;
}

では、なぜこれがエラーを返すのでしょうか? Visual C++ 2010 エラー:

C2664: 'setvalues' : cannot convert parameter 1 from 'int (*)[2]' to 'int *[]'

void setvalues(int *c[2], int *d[2])
{
   (*c[1]) = 1;
   (*d[1]) = 2;
}
int main()
{
    int a[2], b[2];
    setvalues(&a, &b);
    std::cout << a[1] << b[1];
}

配列へのポインターの違いは何ですか? 私は周りを探しましたが、運がありませんでした。

4

3 に答える 3

6

型はへの 2 つのポインタの配列をint *a[2]意味しますが、定義のある式は 2 の配列へのポインタを意味します。どちらも異なる型であり、それらの間の変換はありません。Vlad が既に述べたように、適切な型を提供するには、括弧を追加する必要があります。int&aint a[2]int

void setvalues( int (*c)[2] )

または、C++ で実際の参照を使用することもできます。

void setvalues( int (&c)[2] )

後者の場合、 address-of演算子を使用したり、setvalue関数内で逆参照したりする必要はありません。

int a[2];
setvalues(a); // this is a reference to the array

コードを記述するより簡単な方法は、次を使用することtypedefです。

typedef int twoints[2];
void setvalue( toints& c );
int main() {
   twoints a; // this is int a[2];
   setvalue(a);
}
于 2012-11-30T18:30:14.510 に答える
3

void setvalues(int (&c)[2], int (&d)[2])参照で渡す必要があります。そして、発信者はである必要がありますsetvalues(a, b);。それ以外の場合は、せいぜいポインタでポインタを渡すことになります。

于 2012-11-30T18:26:33.700 に答える
2

これはあなたがそれを修正する方法です:

void setvalues(int c[], int d[])
{
   c[1] = 1;
   d[1] = 2;
}
int main()
{
    int a[2],b[2];
    setvalues(a, b);
    std::cout<<a[1]<<b[1];
}

次のような配列を宣言するとint a[2],b[2];、、、aおよびbはすでにこれらの配列の先頭へのポインタになります。

そして、a[0]そうするとき、それは、配列内の要素にアクセスするために、実際にあるオフセットで配列を尊重するときです。a[1]たとえば、と同じです*(a+1)

参照:http ://www.cplusplus.com/doc/tutorial/arrays/

于 2012-11-30T18:27:33.040 に答える