2017-06-23 14 views
0

transformという名前の関数が2つの配列の最初のインデックスであるabbは、配列aを並べ替える順序を決定する番号のリストを含む配列です。配列へのC++ポインタによるエラー:unary *(has 'int)の無効な型引数、左辺のオペランドとして左辺値が必要です

void transform(int& a, int& b, const int max_size) 
{ 
    int output[max_size]; 

    for(int i = 0; i < max_size; i++) 
    { 
     output[i] = a + (b+i); 
    } 

    for(int j = 0; j < max_size; j++) 
    { 
     (a + j) = output[j]; 
    } 
} 

私はループのための第二の割り当ての左オペランドとして必要なループと左辺値の最初にコマンドで*単項のエラー、無効な型引数を取得するプログラムをコンパイルしてみてください。誰かがここでやろうとしていることを達成するためにポインタを使う正しい方法を説明できますか?

答えて

2

あなたはajを追加するときにajの値の和である一時的な値を取得します。あなたは配列要素にアクセスしていません。ポインタの算術演算は、ポインタがあるときにのみ動作します。参照が参照する要素を参照するためです。それはあなたが配列にアクセスします

*(&a + j) = output[j]; 

のようなポインタに翻訳することができます仕事を得るためには

。それはまた、

output[i] = a + (b+i); 

は、このかかわらずのすべてではなく、関数に配列を渡すことで回避することができ

output[i] = *(&a + *(&b+i)); 

になる必要があることを意味します。それはあなたに何かを与えるだろう

void transform(int a[], int b[], const int max_size) 
{ 
    int output[max_size]; 

    for(int i = 0; i < max_size; i++) 
    { 
     output[i] = a[b[i]]; 
    } 

    for(int j = 0; j < max_size; j++) 
    { 
     a[j] = output[j]; 
    } 
} 
+0

私はCスタイルの配列ではなく、std :: arrayを使用しています。あなたのアドバイスはまだ保持されているか、std:arrayより高価なものを渡していますか? – cdn

+2

@cdn 'std :: array'を使用している場合は、配列を参照渡しするだけです。構文は少し冗長ですが、悪くはありません。'template void transform(std :: array &a、std :: array &b)'のようになり、 'max_size'に' Nは配列のサイズになります。 – NathanOliver

2

aを参考にしてください。 aに書き込んでポインタ演算で操作したい場合は、最初にポインタを作成する必要があります。

*(&a + j) = output[j]; // this assignment will work 

しかし、C++でこのようなことをするのは珍しい方法です。このような関数へのポインタを渡す方がより明確です(必要に応じてconstとマークする - b)。

固定配列サイズで作業する場合は、さらにstd::arrayを使用することをお勧めします。サイズを動的に決定したい場合は、std::vectorです。

1

aは数であるため、表現

a+j = output[j]

は、有効なC++ではありません。

おそらく、整数(int&)への参照ではなく、ポインタ(int*)を渡すことを意味します。 (a + j) = output[j];

関連する問題