ポインタの割り当てに関する限り:
以下からコメントを取得するには:
「int の配列と int だけで構成された struct の配列のメモリ レイアウトは同じです」
ポインター型を定義する必要があるのは、ポインターが指しているデータのサイズをコンパイラーが認識しなければならないためです。整数のサイズは 4 バイトですが、この構造体のサイズは 8 バイトになります。プログラムが location のメモリーにアクセスしようとすると、コンパイラーは、プログラムが 8 バイト後にデータを必要としていることを認識します。s[1]s[0]i[1]i[0]
s構造体の配列 (int 型の 2 つのメンバーを持つ) でiあり、int へのポインターです。の最初の要素はs2 つの 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