C/C++ (またはその他の言語) のポインターは整数ですか? ポインターは、0 からメモリの上限までのメモリ アドレスを保持します。したがって、数学用語では、ポインターは負でない整数と見なすことができます。
C/C++ ではポインタはどのように格納されますか? そして、他の一般的な言語では?
C/C++ (またはその他の言語) のポインターは整数ですか? ポインターは、0 からメモリの上限までのメモリ アドレスを保持します。したがって、数学用語では、ポインターは負でない整数と見なすことができます。
C/C++ ではポインタはどのように格納されますか? そして、他の一般的な言語では?
ここにはいくつかの暗黙の質問があるので、私が理解しているそれぞれの質問を取り上げてみましょう。
まず、C/C++ のポインターは変装した単なる整数ですか?
はい、そうです。いいえ、そうではありません。まず、実装に関しては、ポイントを実装する最も一般的な方法は、プラットフォーム (32 ビットまたは 64 ビット) に適した整数のサイズを選択し、それをアドレス可能なメモリ空間への絶対アドレス値として使用することです。
このコンテキストでは、ポインターは単なる整数であると言えます。
ただし、C/C++ のポインターは常にブラック ボックス データ型として定義されています。意味のある「数値」コンテキストと呼ばれるものがない可能性が非常に高いため、整数として使用することは想定されていません。
確かにそれらは数値のように見え、それらに整数を追加してそれらを超えて移動することができますが、それらはすべて実装固有であり、(意図的に) 文書化されていないため、実際には信頼できません。ここで「信頼できる」とは、ポインターを整数として解釈する場合、ポインターと整数の間に意味のある関係があることに依存してはならないということです。
特定のプラットフォーム、コンパイラ、ランタイムなどについては、アドレス可能な空間内の特定のバイトをアドレス指定する数値として扱われる以上の特別な意味がないという証拠が見つかるかもしれませんが、それでも私はそれについて考えるのを控えます仕方。ポインターはブラック ボックスです。
したがって、次の質問は、ポインタを整数として保持するメモリを再解釈できるかどうかです。確かにそうすることができますが、繰り返しになりますが、その整数の実際の数値は無意味であると考える必要があります。32 ビットのポインターを持っている場合は、それを 32 ビットの整数に格納することができます。
特定の実装では、次のようになります。
p++;
次のような意味になります。
i -= sizeof(element);
すなわち。逆メモリ空間。そのような環境、コンピューター、ランタイム、コンパイラー、またはこれを行うものについては知りませんが、ドキュメントでは許可されています。
そして、それはあなたが気にするべきことです。
数学的な観点からは、ポインターは単にメモリへのインデックスであると主張できます。ただし、ポインターはサイズが異なる可能性があるため、int ではありません。ポインターは、ハードウェアが指示する方法で格納されます。一部のマシンでは int になる可能性がありますが、これに依存するべきではありません。
特にプログラミング言語に関連して、指しているオブジェクトのサイズを考慮する必要があるため、絶対値を見ると演算が異なります。この点で、単純なものとは異なります。int
ポインターは、実際に「int」にキャストできる 32 ビット アドレス (32 ビット マシン上) になります。そうは言っても、数学は整数の場合のようには適用されません。例えば:
int avar = 1;
int *aptr = *avar;
aptr++; // Will change the pointer to skip the size of the data type the pointer is pointing to
ポインター変数は 4 バイトを使用してそのアドレスをスタックに格納しますが、位置と追跡メモリをヒープ上に維持します。これは、参照がアタッチされている場所であり、参照が使用可能なメモリ空間と同じ大きさのメモリを使用できることを示します。