3
#include<stdio.h>
main()
{
  int a[]={0,2,4,6,8};
  int *ptr;
  ptr=a;
  printf("%d", *((char*)ptr+4));
}

*((char*)ptr+4))これの目的は何ですか?

4

3 に答える 3

4

char へのポインターとして表示されるようにポインターをキャストし、4 を追加して 4 char 後のメモリを調べ、最後に結果を逆参照します。int4 バイトを占める典型的なケースでintは、配列の 2 番目のバイトの最初のバイトを調べます。それcharは に昇格され、intに渡されprintf、出力されます。

于 2010-07-02T05:20:07.070 に答える
3

ptr最初は配列の最初の値を指します。からに(char*)ptrキャストします。この値に 4 を追加すると、リトルエンディアン プラットフォームで 32 ビット (4 バイト) の int と 1 バイトの char を想定して、配列の 2 番目の整数を指すようにすることで値がインクリメントされます。外側はそれを逆参照するため、 output .int*char*char*4 * sizeof(char)*2

にキャストしなかった場合は、char*- のように-ポインターに*(ptr+4)追加されるため、出力として 8, ( ) が得られます。4 * sizeof(int)a[4]


更新:楽しんでください!

#include<stdio.h>
main()
{
    int a[]={0x00010203, 0x04050607};
    int *ptr;
    int i, j;
    ptr=a;
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 4; j++)
            printf("%d", *((char*)ptr + 4 * i + j));
        printf("\n");
    }
}

私は出力を得ました:

3210
7654

ビッグ エンディアンのマシンでこれを試すと、次のようになります。

0123
4567

エンディアンについてもっと読む

于 2010-07-02T05:18:24.297 に答える
0

ptr は a のアドレスを指しているので、

*ptr は a の最初の値、または 0 です。

ptr を char* にキャストして 4 を追加することにより、コードは「ptr が格納するアドレスを取得し、それに 4 を追加してから、この場所に値を出力します。

この例では、印刷する必要があります2

于 2010-07-02T05:18:39.150 に答える