0

同等のsizeof演算子を実行しました。

size_t size = (size_t)(1 + ((X*)0));

しかし、の意味を理解することができませんでした(int*)0 or (int*)1000

それはコンパイラに何を伝えますか?そして、なぜそれらに追加されるのですか?詳細を教えてください。

4

3 に答える 3

3

(int *)0「0を整数のアドレスとして扱う」という意味です。これに1を追加すると、メモリ内の「次の」整数のアドレスが取得されます。したがって、結果を整数に戻すと、整数のサイズになります。

ただし、これは未定義の動作に依存しているため、使用しないでください。

于 2012-06-07T14:01:37.837 に答える
1

これは、アドレス0を指すポインターを作成するだけです。それに1を追加すると、ポインターが増加します。これには、データ型のサイズに合わせてアドレスを進める効果があります。この例では、ポインターがクラスXのサイズだけ進められ、ポインターの初期値がゼロであるため、sizeにはクラスXのサイズが含まれます。

于 2012-06-07T14:04:29.210 に答える
1

(int*)0またはの意味を理解し(int*)1000ます。

これらは単なるキャストであり、ここの2行目とまったく同じです。

int a = 25;
short b = (short)a;

toにキャストaするshortと、に値を割り当てることができます。bこれは、として入力されますshort。これは同じこと(int*)0です。コンパイラに、へ0のポインタとして扱うように指示しているだけですint

キャストについてのことは、基本的にコンパイラーに次のように伝えているということです。つまり、実際に何をしているのか、そして最終的なコードでどのような効果があるのか​​を知る必要があるということです。のような式を含むコードは、(int*)1000a)非常に疑わしく、b)コンパイラとコードが記述されたプラットフォームの詳細に大きく依存している可能性があります。システム全体を制御するため、メモリ位置1000で何が行われるかを確実に把握している、ある種の組み込みシステムでは、おそらく意味があります。一般に、そのようなコードは避ける必要があります。

于 2012-06-07T14:05:04.797 に答える