1. ホーム
  2. c

[解決済み] ポインタのアドレスとポインタの値をインクリメントするには?

2022-08-31 14:03:25

質問

仮定してみましょう。

int *p;
int a = 100;
p = &a;

次のコードは実際に何をどのように行うのでしょうか?

p++;
++p;
++*p;
++(*p);
++*(p);
*p++;
(*p)++;
*(p)++;
*++p;
*(++p);

なんだかコーディングが雑になってしまいましたが、このようにコーディングすると実際にどうなるのか知りたいのです。

注:ここでは a=5120300 のアドレスは、ポインタ p であり、そのアドレスは 3560200 . の値はどうなるのでしょうか? p & a の値はどうなるでしょうか?

どのように解決するのですか?

まず、++演算子は*演算子より優先され、()演算子はそれ以外より優先されます。

次に、++number演算子は、何かに代入していないのであればnumber++演算子と同じです。違いは、number++はnumberを返してからnumberをインクリメントし、++numberは先にインクリメントしてからそれを返します。

第三に、ポインタの値を増加させることは、その内容のサイズだけ増加させることであり、つまり、配列で反復するように増加させることである。

というわけで、すべてをまとめると

ptr++;    // Pointer moves to the next int position (as if it was an array)
++ptr;    // Pointer moves to the next int position (as if it was an array)
++*ptr;   // The value pointed at by ptr is incremented
++(*ptr); // The value pointed at by ptr is incremented
++*(ptr); // The value pointed at by ptr is incremented
*ptr++;   // Pointer moves to the next int position (as if it was an array). But returns the old content
(*ptr)++; // The value pointed at by ptr is incremented
*(ptr)++; // Pointer moves to the next int position (as if it was an array). But returns the old content
*++ptr;   // Pointer moves to the next int position, and then get's accessed, with your code, segfault
*(++ptr); // Pointer moves to the next int position, and then get's accessed, with your code, segfault

ここにはたくさんの事例があるので、何か間違いがあるかもしれません、間違っていたら訂正してください。

EDITです。

というわけで、私の勘違いでした。優先順位は私が書いたものよりもう少し複雑なので、こちらをご覧ください。 http://en.cppreference.com/w/cpp/language/operator_precedence