sizeof
16ビットと32ビットのシステムでポインターが何を返すか知りたかっただけです
printf("%d", sizeof(int16 *));
printf("%d", sizeof(int32 *));
ありがとうございました。
簡単な回答: 32 ビット Intel 386 では、これらが 4 を返す可能性がありますが、16 ビット 8086 をターゲットにすると、選択したメモリ モデルに応じて 2 または 4 が表示される可能性が高くなります。
詳細
最初の標準 C は、ポインターについて特別なことを要求していません。指定された変数を「指す」ことができる必要があり、ポインター演算は指定された変数のデータ領域内で機能する必要があるだけです。ポインターのエキゾチックな表現を持つ C インタープリターでさえ可能であり、この柔軟性を考えると、ポインターはターゲットに応じて実際に任意のサイズになる可能性があります。
ただし、通常、コンパイラはメモリアドレスでポインターを表現するため、C標準で定義されていないいくつかの操作が「通常は機能する」ようになります。コンパイラーがポインターを表現する方法を選択する方法は、対象となるアーキテクチャーによって異なります。コンパイラーの作成者は明らかに、有用で効率的な表現を選択しました。
有用な表現の例は、Harward アーキテクチャ マイクロのジェネリック ポインターです。コードとデータ RAM の両方にアドレス指定できます。8 ビット マイクロでは、1 つのタイプ バイトと 2 つのアドレス バイトとしてエンコードされる可能性があります。
これは効率的な表現の良い例です。特定のポインタを持たないのはなぜでしょうか? 1 つはコード メモリを指し、もう 1 つはデータ メモリを指しますか? わずか 2 バイト (8051 などの 8 ビット マイクロでは通常のように 16 ビット アドレス空間を想定) であり、タイプごとに選択する必要はありません。
しかし、その後、複数のタイプのポインターがあります (8051 の場合も同様です: 内部 RAM 内を指しているポインターの追加のタイプが少なくとも 1 つある可能性があります...)。次に、プログラマーは、使用する必要がある特定のポインター型について考える必要があります。
もちろんサイズも違います。8051 をターゲットとするこの架空のコンパイラでは、3 バイトのジェネリック ポインター型、2 バイトの外部データ メモリ ポインター型、2 バイトのコード メモリ ポインター型、および 1 バイトの内部 RAM ポインター型があります。
また、これらはポインターのタイプであり、ポインターが指すデータのタイプではないことに注意してください(ポインターが関数ポインターであるという事実は、データポインターとは異なるタイプであることを意味するため、関数ポインターはここでは少しずれています。それが指すデータ型が関数型であることを除いて、特定の構文の違い)。
8086 であると仮定して、16 ビット マシンに戻ります。
コンパイラが 1 つのデータ セグメントを持っていると想定するメモリ モデルを使用する場合、near
またはfar
. それ以外の場合、デフォルトで 4 バイトのポインターが取得されます。2 バイト ポインターの表現は、通常、単純に 16 ビット オフセットですが、4 バイト ポインターの場合は、セグメント:オフセットのペアです。near
or指定子をいつでも適用しfar
て、ポインターを明示的に 1 つまたは別の型にすることができます。
(near
ポインターも使用するプログラムでポインターはどのように機能するのfar
でしょうか?単純に、コンパイラーによって生成されたデフォルトのデータセグメントがあり、すべてnear
の s がその中に配置されています。コンパイラーは、単純に永久に、または少なくともほとんどの場合、ds
セグメントレジスターを持っている可能性がありますデフォルトのデータセグメントで満たされているため、near
s が指すデータへのアクセスが高速になります)
a ポインターのサイズは、アーキテクチャーによって異なります。正確には、メモリにアクセスするためのバスシステムのサイズを反映する、そのアーキテクチャで使用されるアドレスのサイズに依存します。
たとえば、32 ビット アーキテクチャでは、アドレスのサイズは 4 バイトです。
sizeof (void *) == 4 Bytes.
64 ビットでは、アドレスのサイズは 8 バイトです。
sizeof (void *) == 8 bytes.
すべてのポインターは、型と相互に依存して同じサイズであることに注意してください。したがって、コードを実行すると、int16
ポインターのサイズとint32
ポインターのサイズは同じになります。
ただし、16 ビット システムでのポインタのサイズは 2 バイトである必要があります。通常、16 ビット システムのメモリは非常に少なく (数メガバイト)、すべての場所をアドレス指定するには 2 バイトで十分です。より正確に言うと、16 ビットのポインターでは、使用できる最大メモリは約 65 KB です。(今日のコンピューターのメモリ量と比較すると、実際にはほとんどありません)。