ポインター演算を使用して特定の要素にアクセスするときに、配列内の値を変更するにはどうすればよいですか?
#include <stdio.h>
int main() {
int a[3] = {1, 1, 1}, b[3] = {2, 2, 2};
a++ = b++; // How can I get this to work so a[1] = b[1]?
return 0;
}
ポインター演算を使用して特定の要素にアクセスするときに、配列内の値を変更するにはどうすればよいですか?
#include <stdio.h>
int main() {
int a[3] = {1, 1, 1}, b[3] = {2, 2, 2};
a++ = b++; // How can I get this to work so a[1] = b[1]?
return 0;
}
配列はポインターではありません。これを 3 回繰り返します。配列はポインターではありません。
配列をインクリメントすることはできません。配列は割り当て可能な値ではありません (つまり、変更することはできません)。もちろん、それにインデックスを付けて値を取得できます。
a[1] = b[1];
第二に、現在のコードは、配列の要素に割り当てるつもりだったときに、インクリメントしてから配列自体に新しい値を割り当てようとしています。配列は必要に応じてポインターに分解されるため、これも機能します。
int *a_ptr = a;
int *b_ptr = b;
*++a_ptr = *++b_ptr;
// or, better...
a_ptr[1] = b_ptr[1];
それがあなたの意図したことです。私はバージョン 1 を好みますが、読みやすいことが多いため、多くの場合、ポインターを使用したインデックスも使用します。
a[1] = b[1] のようにこれを機能させるにはどうすればよいですか?
単純:
a[1]++;
a[1]
(1)を(2)になるようにインクリメントしたいだけの場合b[1]
、または
a[1] = b[1];
その値が何であるかに関係なくa[1]
、同じ値を持ちたい場合。b[1]
ポインター演算を使用して特定の要素にアクセスするときは?
あなたの例では、どの要素にもアクセスしていません。また、 とはポインターではなく配列であるためa
、ポインター演算も行っていません。b
あなたの質問の定式化は、その理由と理由の両方で解釈が困難です
a++ = b++;
1) 完全に無意味です 2)a
とb
がポインタだったとしても、合法的な C ではありません。なぜなら、左辺は左辺値でなければなりませんが、そうでa++
はないからです 3) はa[1]
と同じにしたいというあなたの希望と識別できるほど関連していませんb[1]
。おそらくあなたが望むのは:
int* ap = a; // get pointer to first element of a
int* bp = b; // get pointer to first element of b
// point ap to second element of a and
// point bp to second element of b and
// copy the value at *bp to *ap
*++ap = *++bp;
それは実際に に設定さa[1]
れb[1]
ます。
この場合の配列は、実際にはポインターではありません。それらはポインターとしてアクセスされるとコンパイラーによって変換されますが、a++
.
算術演算でこれを行う場合は、実際のポインターが必要になります。
int *ap = a, *bp = b;
*ap++ = *bp++;
これは、a[0] = b[0];
各ポインターを関連する配列の次の要素に移動してから移動するようなものです。
しかし、あなたの質問は、あなたが設定したいと言っていますa[1] = b[1]
。さて、あなたはこれを行うことができます:
*++ap = *++bp;
または、配列インデックスを使用して、何をしているのかをより明確にすることもできます。