1 バイトが 8 ビットで、メモリがリトル エンディアンのバイト順で配置され、intがメモリ内の 4 バイトを表す、かなり典型的なプラットフォームを想像してみましょう。このプラットフォームでは、値は次の1ように配置されます。
00000001 00000000 00000000 00000000
^
the first element of 'a'
pcharは(notへの) ポインターとして宣言されint、 array の最初の要素を指すように初期化されaます。charこのプラットフォームの Aは 1 バイトを表します。intとして解釈された上記の値は次のcharようになります。
00000001 -------- -------- --------
| |
------
char is only 8 bits wide
したがって、1 バイトを読み取っても 4 バイトを読み取っても、つまり を読み取っても を読み取って*pもa[0]、値は1です。pただし、へのポインタであるをインクリメントすると、メモリ内charの次の文字、つまり次のバイトを指すようになります。
00000001 00000000 00000000 00000000
00000001 00000000 -------- --------
^ ^ ^ ^
p p+1 p+2 p+3 ...
a[1]は次のint( 2) をp[1]指し、次のchar、つまり を指し0ます。
余談ですが、特定のプロセッサがリトル エンディアンまたはビッグ エンディアンのバイト順を使用しているかどうかを判断する方法を実際に見つけました。システムがビッグ エンディアン (最上位バイトが最初) の場合、最初printfに 0 が出力されます。これは、メモリ レイアウトが変更されたためです。
0000000 00000000 00000000 00000001
^
the first element of 'a'
0000000 -------- -------- --------
^
p
値 1 を表すビッグエンディアン順に配置された複数のバイトがあり、最初のバイトのみを読み取る場合、その値 (1または0) を使用してマシンのエンディアンをテストできます。
int n = 1;
if(*(char*)&n == 1)
// little endian
else
// big endian