1

このコードは「世界」をどのように出力するので、誰でも説明できますか?

    #include<stdio.h>
    int main()
    {
        char i =10;
        char *pc = (char*)&i;
        int *pi = (char*)&i;
        pi++ && pc++;
        if((void*)pi==(void*)pc)
            printf("hello");
        else
            printf("world")

    }
4

2 に答える 2

2

§6.5.2.4 の章を引用すると、Postfix のインクリメント演算子とデクリメント演算子C11標準から (強調鉱山)

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

さて、あなたの場合、

  1. 最初は、同じアドレスpcpi指しています。
  2. pcは type へのポインターですがchar、は typepiへのポインターintです。

次、

  • を行った後pc++pc型のサイズだけインクリメントされますchar。したがって、 pcと同じメモリ位置を指します(char *)pc + sizeof(char)
  • を行った後pi++pi型のサイズだけインクリメントされますint。したがって、piは と同じメモリ位置を指し(char *)pi + sizeof(int)ます。

ここで、sizeof(char)1 でsizeof(int)4/8 (32/64 ビット プラットフォーム)を考慮するpcと、 とpiが保持する最終的なポインターが異なることがわかります。

したがって、 はiffalse と評価されます。

于 2015-12-31T20:20:45.093 に答える
0

ポインター演算では、ポインターが指している 1 つの完全なオブジェクトを通過するには、ポインターが何バイト移動する必要があるかを考えると便利です。

ポインターはオブジェクトintを指しintます。int1 つのオブジェクトを超えてポインターを移動intするには、そのオブジェクト内のすべてのバイトint(64 ビット マシンでは 8 バイト) を超えてポインターを移動する必要があります。

同様に、より大きなオブジェクトへのポインターをそのようなオブジェクトの 1 つを超えて移動すると、そのオブジェクト内のすべてのバイトを超えてポインターを移動することになります。

したがって、ポインターをインクリメント (またはデクリメント) することを、ポインターをオブジェクト (またはオブジェクト) の前 (または前) に移動することと考えると、ポインターの値 (アドレス) がそのオブジェクトのバイト数だけ変化しなければならないことは明らかです。 .

あなたの例では、最初は両方のポインターがメモリ内の同じアドレスを指しています。intポインタをインクリメントすると のサイズだけ移動し、ポインタintをインクリメントするとのサイズだけ移動します。それぞれが異なる値で変化するため、それらの値は最終的に異なります。charchar

于 2015-12-31T21:09:52.107 に答える