2012-11-30 9 views
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]; 
} 

配列へのポインタ程度違うのか?私は周りを捜したが運がない。

+0

は[CDECL](http://cdecl.ridiculousfish.com/?q=int+*c%5B2%5D)あなたの友達です。 –

答えて

6

タイプint *a[2]intから2つのポインタの配列が、定義int a[2]有する発現&a 2のアレイにポインタ手段int。どちらも異なるタイプであり、それらの間に変換はありません。ヴラドは、すでに述べたように、あなたは括弧を追加する必要があり、適切なタイプを提供する:

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

それとも、C++での実際の参照使用することができます:あなたが必要としない後者の場合には

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

int a[2]; 
setvalues(a); // this is a reference to the array 
setvalue関数内アドレスのオペレータまたは間接参照を使用します

コードを書くための簡単な方法は、typedefを使用することです:

typedef int twoints[2]; 
void setvalue(toints& c); 
int main() { 
    twoints a; // this is int a[2]; 
    setvalue(a); 
} 
+0

私は今、それを得る、ありがとう。私もそれは文字列の配列でも同じだと思いますか? – NoToast

+0

@ user1867129:あなたは* string *の意味に依存しますが、逆の括弧を使用しなければならない配列へのポインタを使用する場合は、構文はすべての型に対して一貫しています'int(* a)[2]'は、実際には、カッコの外にある*すべてをグループ化します:* aは、括弧の外側に記述された型へのポインタです*) –

3

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

+0

答えをありがとう! – NoToast

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];を、その後、abはすでにこれらの配列の先頭へのポインタです。

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

リファレンス:http://www.cplusplus.com/doc/tutorial/arrays/

+1

ポインタで渡すのと同じであるため、これは完全には正しくありません。その配列の長さは何ですか?コンパイル時に強制されますか?いいえ。 –

関連する問題