ポインタの割り当てに関する限り:
以下からコメントを取得するには:
「int の配列と int だけで構成された struct の配列のメモリ レイアウトは同じです」
ポインター型を定義する必要があるのは、ポインターが指しているデータのサイズをコンパイラーが認識しなければならないためです。整数のサイズは 4 バイトですが、この構造体のサイズは 8 バイトになります。プログラムが location のメモリーにアクセスしようとすると、コンパイラーは、プログラムが 8 バイト後にデータを必要としていることを認識します。s[1]
s[0]
i[1]
i[0]
s
構造体の配列 (int 型の 2 つのメンバーを持つ) でi
あり、int へのポインターです。の最初の要素はs
2 つの int の構造体であるため、 の最初の要素i = s
の最初のメンバーのアドレスを に代入しs
ますi
。
i = &s[0]
は同じ課題です。
0x00s[0]
で開始した場合、最初のメンバーはアドレス0x00を持ち、2 番目のメンバーはアドレス0x04を持ちます。0x08で始まる場合、その場所の構造体には、アドレス0x0Cを持つ 2 番目のメンバーがあります。s[1]
ではi = s
、の最初の要素の 2 番目のメンバーであるi[0]
アドレス0x00i[1]
があり、 はアドレス0x04を持っていますs
。配列内の 2 番目の構造体の最初のメンバーであるi[2]
アドレス0x08i[3]
を持ち、配列内の 2 番目の構造体の 2 番目のメンバーであるアドレス0x0Cを持ちます。等々...
{ 10, 20 } { 15, 25 } { 8, 75 } { 6, 2 }
s:| 0 | 1 | 2 | 3 |
i:| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
i
最初の整数 (8 つすべてのうち) を指すようになりました。
i[0] = 10
i[7] = 2
最初のprintfステートメントは次のように解釈さi[7] = 2
れます。s[2]
{8,75}
8
ポインターは実際には互換性がなく、gcc バージョン 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) でコンパイルすると、次の警告が生成されます。
test.c: 関数 'main' 内: test.c:10: 警告: 互換性のないポインター型からの代入
ただし、プログラムは出力をコンパイルして生成します。
8 75 15 20 85