#include<stdio.h>
main()
{
int a[]={0,2,4,6,8};
int *ptr;
ptr=a;
printf("%d", *((char*)ptr+4));
}
*((char*)ptr+4))
これの目的は何ですか?
#include<stdio.h>
main()
{
int a[]={0,2,4,6,8};
int *ptr;
ptr=a;
printf("%d", *((char*)ptr+4));
}
*((char*)ptr+4))
これの目的は何ですか?
char へのポインターとして表示されるようにポインターをキャストし、4 を追加して 4 char 後のメモリを調べ、最後に結果を逆参照します。int
4 バイトを占める典型的なケースでint
は、配列の 2 番目のバイトの最初のバイトを調べます。それchar
は に昇格され、int
に渡されprintf
、出力されます。
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
エンディアンについてもっと読む
ptr は a のアドレスを指しているので、
*ptr は a の最初の値、または 0 です。
ptr を char* にキャストして 4 を追加することにより、コードは「ptr が格納するアドレスを取得し、それに 4 を追加してから、この場所に値を出力します。
この例では、印刷する必要があります2