1

次のコードがそのように機能する理由を理解してください。

#include <stdio.h>

int main(){
    int a = 10;
    void *b = &a;
    int *p = b; 
    printf("%u",*p++);
    return 0;
}

printf の出力が 10 になることはわかっていますが、*p++ が 10 である理由がよくわかりません。

私の手順は次のとおりです。

1) void *b = &a;a のアドレスをポインタ b に格納する

2) int *p = b;ポインター p は、ポインター b と同じデータ項目を指すようになりました

3)printf("%u",*p++);私が混乱するところです...ポインタ p の逆参照は 10 です...*p++基本的に 10+1 と同じではなく、11 になりますか?

4

6 に答える 6

3

*p++あくまで中古品*(p++)です。インクリメントされる前の の値に評価されます。pこれは へのアドレスaです。次に、 value に評価されるそれを逆参照します10

于 2013-10-19T04:09:07.553 に答える
2

式のポストインクリメント演算子は、*p++その場所に格納されている値ではなくポインターに適用されるため、評価の前後で結果が 11 になることはありませ。この式*p++は、逆参照p(値を取得) してから、1 つの場所をインクリメントすることを意味しpます。pを指すのでint、それをインクリメントするとsizeof(int)バイトが前方に移動します。加算は、10 を指す値には適用されませんp

ただし、式 (*p)++ は異なります。p を逆参照し (その値を取得)、そのメモリ位置の値をインクリメントします。式は元の値に評価されます。したがって、ステートメントを実行した後

int c = (*p)++;

変数cは 10 にa等しく、11 に等しくなります。

于 2013-10-19T04:07:23.323 に答える
2

*p++として解析され*(p++)ます。p++は に評価されてからpインクリメントれるpため、次の への参照まで変化は見られませんp*pは 10 です、10*p++です (ただし p は現在 を指しています&a+1)、*++p未定義の動作です (*(&a+1)は有効な値ではないため)、 10 ですが11 に(*p)++変更され、 (または) は 11 です (そのままです)。a++*p++(*p)a

于 2013-10-19T04:15:17.517 に答える
2

なぜ *p++ は 10 ですか?

[C11: §6.5.2.4/2]: 後置 ++ 演算子の結果はオペランドの値です。副作用として、オペランド オブジェクトの値がインクリメントされます (つまり、適切な型の値 1 がそれ​​に追加されます)。

以下のステートメント

printf("%u",*p++);

と同等です

printf("%u",*p); /* p points to 'a' and value of `a` is 10. Hence, 10 is printed */
p = p + 1;  

ppointer-to-int型です。したがって、1にスケーリングされsizeof (int)ます。

intその結果、p はat アドレスを指すようになりました。p + sizeof (int)

于 2013-10-19T05:27:23.687 に答える