3

次のコードスニペットがあるとします。

int8_t *a = 1;
int16_t *b = (int16_t*)(a + 1);
int32_t *c = (int32_t*)b + 2;

次に、a = 1、b = 2、c = 10です(%iでprintf()を使用し、これに関する警告が表示されたため、ここでもわかりません。)

これがどのように機能するのかよくわかりません。私にはいくつかの理論がありますが、それに関するいくつかのドキュメントを読むことを好みます。

この3つのケースの正確な動作を検索または説明するためのキーワードを誰かに教えてもらえますか?検索する単語が不足しているため、SOまたはgoogleでこの問題に関する情報を見つけることができませんでした。

入力すると出力は変わりますか

int16_t *a = 1;
int32_t *b = (int16_t*)(a + 1);
int64_t *c = (int32_t*)b + 2;

代わりは?

4

2 に答える 2

3

任意の値をポインター変数に入れたり、%i.

とはいえ、ほとんどの環境はそれで問題ないと思うので、説明を始めることができると思います。

aである場合1、それは (ずれて) メモリアドレスを指します1。次に、 を指すように 1 を追加し2、結果を にキャストしbます。

その後、baをベイクしuint32_t *て 2 を追加するので、実質的に を追加2*4して make bpoint を取得し10 (0xA)ます。

上記の変更を行うと、 (andは 16 ビットなので) を指し、追加aすると( and ) が指し示され (そこではキャストは必要ありません)、3+2*4 = 11 を指します。121b34c

于 2012-10-26T14:53:52.930 に答える
2

このような特定の質問ではなく、おそらく言語自体の理解を深めることを試みる必要があります(ポインター、逆参照など)http://www.cplusplus.com/doc/tutorial/pointers/

ポインタに値を割り当てることは、このポインタがアドレス(値)のメモリを表すと言うようなものです。

int8_t * a = 1; // a is memory at address 1
int16_t *b = (int16_t*)(a + 1); // b is memory at address (a + 1)... 2
int32_t *c = (int32_t*)b + 2; // c is memory at address 2 + (2 * sizeof(int32_t))... 10
于 2012-10-26T14:57:43.020 に答える