同等のsizeof演算子を実行しました。
size_t size = (size_t)(1 + ((X*)0));
しかし、の意味を理解することができませんでした(int*)0 or (int*)1000
。
それはコンパイラに何を伝えますか?そして、なぜそれらに追加されるのですか?詳細を教えてください。
同等のsizeof演算子を実行しました。
size_t size = (size_t)(1 + ((X*)0));
しかし、の意味を理解することができませんでした(int*)0 or (int*)1000
。
それはコンパイラに何を伝えますか?そして、なぜそれらに追加されるのですか?詳細を教えてください。
(int *)0
「0を整数のアドレスとして扱う」という意味です。これに1を追加すると、メモリ内の「次の」整数のアドレスが取得されます。したがって、結果を整数に戻すと、整数のサイズになります。
ただし、これは未定義の動作に依存しているため、使用しないでください。
これは、アドレス0を指すポインターを作成するだけです。それに1を追加すると、ポインターが増加します。これには、データ型のサイズに合わせてアドレスを進める効果があります。この例では、ポインターがクラスXのサイズだけ進められ、ポインターの初期値がゼロであるため、sizeにはクラスXのサイズが含まれます。
(int*)0
またはの意味を理解し(int*)1000
ます。
これらは単なるキャストであり、ここの2行目とまったく同じです。
int a = 25;
short b = (short)a;
toにキャストa
するshort
と、に値を割り当てることができます。b
これは、として入力されますshort
。これは同じこと(int*)0
です。コンパイラに、へ0
のポインタとして扱うように指示しているだけですint
。
キャストについてのことは、基本的にコンパイラーに次のように伝えているということです。つまり、実際に何をしているのか、そして最終的なコードでどのような効果があるのかを知る必要があるということです。のような式を含むコードは、(int*)1000
a)非常に疑わしく、b)コンパイラとコードが記述されたプラットフォームの詳細に大きく依存している可能性があります。システム全体を制御するため、メモリ位置1000で何が行われるかを確実に把握している、ある種の組み込みシステムでは、おそらく意味があります。一般に、そのようなコードは避ける必要があります。